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

Memahami cast dari byte ke oid

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.

Per dokumentasi:

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;
    

    SQL Fiddle.

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat bermigrasi di Heroku

  2. Beberapa gabungan kiri pada beberapa tabel dalam satu kueri

  3. Membuat emacs untuk menyorot sintaks postgresql secara default

  4. bundel gagal - Tidak dapat menemukan pustaka klien PostgreSQL (libpq)

  5. Apakah Postgres menulis ulang seluruh baris pada pembaruan?