Pemerannya bukan pemeran sejati. Hanya saja (ab) menggunakan sintaks yang nyaman. objek besar (LO) dibuat di latar belakang yang disimpan secara terpisah dan referensi OID dikembalikan.
OID yang dikembalikan pada dasarnya adalah FK ke PK tabel sistem pg_largeobject
.
CREATE TABLE
sepenuhnya independen dari fungsi dan pseudo-cast.
CREATE TABLE bytea_to_lo (
largeObj lo
);
Ini hanya kasus penggunaan biasa untuk pemeran tugas yang dibuat di atas, yang menjadi jelas dari baris berikut yang Anda lupa kutip:
INSERT INTO bytea_to_lo VALUES (DECODE('00AB','hex'));
Apa yang terjadi di sini?
Tipe data lo
adalah domain di atas tipe dasar oid
, dibuat oleh modul tambahan lo
(salah dirujuk sebagai "paket lo_manage" di entitas blog Grace Batumbya
). Per dokumentasi:
Fungsi decode()
mengembalikan bytea
. INSERT
pernyataan menetapkan bytea
nilai ke kolom largeObj
, yang memicu cast tugas ke jenisnya lo
, dan di situlah pemeran di atas berperan.
Peringatan / Perbaikan / Pembaruan
Entri blog sudah tidak rapi dan ketinggalan zaman sekarang.
-
Tidak perlu menyebutkan itu (per dokumentasi ):
Secara efektif, Anda harus menjadi pengguna super.
-
Salah ketik di
CREATE TABLE
:nama kolom dan tipe dibalik. -
Definisi fungsi bertele-tele dan tidak efisien. Ini akan lebih baik (untuk Postgres 9.3 atau lebih tua):
CREATE OR REPLACE FUNCTION blob_write(bytea) RETURNS oid AS $func$ DECLARE loid oid := lo_create(0); lfd int := lo_open(loid,131072); -- = 2^17 = x2000 -- symbolic constant defined in the header file libpq/libpq-fs.h -- #define INV_WRITE 0x00020000 BEGIN PERFORM lowrite(lfd, $1); PERFORM lo_close(lfd); RETURN loid; END $func$ LANGUAGE plpgsql VOLATILE STRICT;
Ada bawaan fungsi untuk ini di Postgres 9.4 . Gunakan itu sebagai gantinya:
lo_from_bytea(loid oid, string bytea)
Dari catatan rilis :
Untuk CREATE CAST
(per dokumentasi
):
Saya menyarankan varian kelebihan beban dengan hanya bytea
parameter:
CREATE OR REPLACE FUNCTION lo_from_bytea(bytea)
RETURNS oid LANGUAGE sql AS
'SELECT lo_from_bytea(0, $1)';
CREATE CAST (bytea AS oid) WITH FUNCTION lo_from_bytea(bytea) AS ASSIGNMENT;
Karena pseudo-cast memiliki efek samping yang cukup besar, saya tidak yakin untuk menjadikannya sebagai ASSIGNMENT
Pemeran. Saya mungkin akan mulai dengan eksplisit saja: