PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menulis fungsi yang mengembalikan nilai teks atau bilangan bulat?

Yang mungkin Anda butuhkan

Kemungkinan besar Anda memerlukan satu fungsi untuk mengembalikan text dan satu lagi untuk mengembalikan integer atau fungsi yang mengembalikan boolean untuk menunjukkan keberhasilan. Semua ini sepele dan saya akan merujuk Anda ke manual yang sangat baik di CREATE FUNCTION atau contoh kode dalam pertanyaan serupa di SO.

Apa yang sebenarnya Anda tanyakan

Bagaimana cara menulis fungsi yang mengembalikan nilai teks atau bilangan bulat?

... dalam arti bahwa kita memiliki satu jenis pengembalian berupa text atau integer . Tidak sepele, tetapi juga tidak mustahil seperti yang telah dikemukakan. Kata kuncinya adalah:tipe polimorfik .

Membangun di atas tabel sederhana ini:

CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);

Fungsi ini mengembalikan bilangan bulat atau teks (atau jenis lainnya jika Anda mengizinkannya), tergantung pada jenis inputnya.

CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
  RETURNS anyelement AS
$func$
BEGIN

CASE pg_typeof(_data) 
WHEN 'text'::regtype THEN
    INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
    RETURNING txt
    INTO _result;

WHEN 'integer'::regtype THEN
    INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
    RETURNING nr
    INTO _result;

ELSE
    RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;

END
$func$
LANGUAGE plpgsql;

Telepon:

SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);

Kasus sederhana

Satu fungsi yang mengembalikan TRUE / FALSE untuk menunjukkan apakah suatu baris telah dimasukkan, hanya satu parameter input dari berbagai jenis:

CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
  RETURNS boolean AS
$func$
BEGIN

CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
   INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);

WHEN 'integer'::regtype THEN
   INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);

ELSE
   RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;

IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;

END
$func$
LANGUAGE plpgsql;

Jenis input dapat diganti dengan text parameter untuk sebagian besar tujuan, yang dapat dilemparkan ke dan dari jenis lainnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres gagal dengan 'tidak dapat membuka file pemetaan relasi global/pg_filenode.map'

  2. Perbaiki “ERROR:  setiap kueri KECUALI harus memiliki jumlah kolom yang sama” di PostgreSQL

  3. Kembalikan nol jika tidak ada catatan yang ditemukan

  4. Mengapa PostgreSQL tidak menyukai nama tabel UPPERCASE?

  5. Format Bulan dalam Angka Romawi di PostgreSQL