PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

बाइटा से ओइड तक कास्ट को समझना

कास्ट एक सच्ची कास्ट नहीं है। यह सुविधाजनक सिंटैक्स का उपयोग करके बस (ab) है। एक बड़ी वस्तु (LO) पृष्ठभूमि में बनाया गया है जिसे अलग से संग्रहीत किया जाता है और इसका संदर्भ देने वाला ओआईडी वापस कर दिया जाता है।

प्रति दस्तावेज़:

लौटा हुआ OID मूल रूप से सिस्टम तालिका के PK के लिए एक FK है pg_largeobject

CREATE TABLE समारोह और छद्म कलाकारों से पूरी तरह से स्वतंत्र है।

CREATE TABLE bytea_to_lo (
   largeObj lo 
);

यह ऊपर बनाए गए असाइनमेंट कास्ट के लिए केवल एक सामान्य उपयोग का मामला है, जो निम्न पंक्ति से स्पष्ट हो जाता है जिसे आप उद्धृत करना भूल गए:

INSERT INTO bytea_to_lo VALUES (DECODE('00AB','hex'));

यहां क्या होता है?

डेटा प्रकार lo आधार प्रकार पर एक डोमेन है oid , अतिरिक्त मॉड्यूल द्वारा बनाया गया lo (ग्रेस बाटुम्ब्या की ब्लॉग इकाई ) प्रति दस्तावेज़:

फ़ंक्शन decode() रिटर्न bytea . INSERT स्टेटमेंट bytea असाइन करता है कॉलम का मान largeObj , जो एक असाइनमेंट कास्ट को उसके प्रकार lo . पर ट्रिगर करता है , और यहीं से उपरोक्त कलाकार आते हैं।

चेतावनी/सुधारात्मक/अपडेट

ब्लॉग प्रविष्टि अब तक मैला और पुरानी हो चुकी है।

  • यह उल्लेख करने की जहमत नहीं उठाता (प्रति दस्तावेज़ ):

    प्रभावी रूप से, आपको सुपरयूज़र होना चाहिए।

  • CREATE TABLE में टाइप करें :स्तंभ का नाम और प्रकार उलटा।

  • फ़ंक्शन परिभाषा वर्बोज़ और अक्षम है। यह बेहतर होगा (पोस्टग्रेज के लिए 9.3 या पुराने):

    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.

एक बिल्ट-इन है समारोह इसके लिए Postgres 9.4 . में . इसके बजाय इसका इस्तेमाल करें:

lo_from_bytea(loid oid, string bytea)

रिलीज़ नोट से :

CREATE CAST के लिए (प्रति दस्तावेज़ ):

मैं केवल bytea . के साथ एक अतिभारित संस्करण का सुझाव देता हूं पैरामीटर:

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;

चूंकि स्यूडो-कास्ट का काफी बड़ा साइड इफेक्ट है, इसलिए मैं इसे ASSIGNMENT बनाने के लिए आश्वस्त नहीं हूं। फेंकना। मैं शायद केवल-स्पष्ट के साथ शुरू करूंगा:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज़ पढ़ने की पहुँच के लिए CSV फ़ाइल नहीं खोल सकते:अनुमति अस्वीकृत

  2. हवा की गति (वेक्टर परिमाण) और हवा की दिशा (वेक्टर दिशा) के वेक्टर औसत की गणना के लिए पोस्टग्रेज एग्रीगेट फ़ंक्शन

  3. Postgres . में मान बढ़ाएँ

  4. PostgreSQL - स्ट्रिंग को ASCII पूर्णांक में बदलें

  5. एक असामान्य तालिका से गैर-फुलाए गए गणना की गणना कैसे करें