कास्ट एक सच्ची कास्ट नहीं है। यह सुविधाजनक सिंटैक्स का उपयोग करके बस (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;
एक बिल्ट-इन है समारोह इसके लिए 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
बनाने के लिए आश्वस्त नहीं हूं। फेंकना। मैं शायद केवल-स्पष्ट के साथ शुरू करूंगा: