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.