यह यहाँ NSW के सुदूर दक्षिण तट पर सुबह है, और मुझे लगा कि मैं इस पर एक और दरार लूंगा। मुझे पहले उल्लेख करना चाहिए था कि हमारा परिनियोजन वातावरण RDS है, जो COPY को कम आकर्षक बनाता है। लेकिन एक सरणी में गुजरने का विचार जहां प्रत्येक तत्व में पंक्ति डेटा शामिल है बहुत . है आकर्षक। यह एक बहु-मूल्य वाली INSERT की तरह है, लेकिन विभिन्न वाक्यात्मक चीनी के साथ। मैंने पोस्टग्रेज में सरणियों पर थोड़ा सा ध्यान दिया है, और हमेशा वाक्य रचना से दूर हो जाता हूं। मुझे अध्ययन के लिए कुछ शीर्ष पोस्टरों से बहुत सारे विवरणों के साथ कुछ वाकई उत्कृष्ट सूत्र मिले:
https://dba.stackexchange .com/questions/224785/pass-array-of-mixed-type-into-stored-function
वहां से, मेरे पास एक कार्यशील परीक्षण कार्य है:
DROP FUNCTION IF EXISTS data.item_insert_array (item[]);
CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item[])
RETURNS int
AS $$
INSERT INTO item (
id,
marked_for_deletion,
name_)
SELECT
d.id,
d.marked_for_deletion,
d.name_
FROM unnest(data_in) d
ON CONFLICT(id) DO UPDATE SET
marked_for_deletion = EXCLUDED.marked_for_deletion,
name_ = EXCLUDED.name_;
SELECT cardinality(data_in); -- array_length() doesn't work. ¯\_(ツ)_/¯
$$ LANGUAGE sql;
ALTER FUNCTION data.item_insert_array(item[]) OWNER TO user_bender;
मंडली को बंद करने के लिए, यहां कुछ इनपुट का उदाहरण दिया गया है:
select * from item_insert_array(
array[
('2f888809-2777-524b-abb7-13df413440f5',true,'Salad fork'),
('f2924dda-8e63-264b-be55-2f366d9c3caa',false,'Melon baller'),
('d9ecd18d-34fd-5548-90ea-0183a72de849',true,'Fondue fork')
]::item[]
);
मेरे परीक्षण परिणामों पर वापस जाकर, यह मोटे तौर पर मेरे मूल बहु-मूल्य डालने के साथ-साथ प्रदर्शन करता है। अन्य दो विधियाँ जो मैंने मूल रूप से पोस्ट की हैं, मान लीजिए, 4x धीमी है। (परिणाम बहुत अनिश्चित हैं, लेकिन वे हमेशा बहुत धीमे होते हैं।) लेकिन मेरे पास अभी भी मेरा मूल प्रश्न बचा है:
क्या यह इंजेक्शन सुरक्षित है?
यदि नहीं, तो मुझे लगता है कि मुझे इसे पीएल/पीजीएसक्यूएल में फ़ोरैच लूप के साथ फिर से लिखना होगा और इंजेक्शन-क्लीनिंग टेक्स्ट प्रोसेसिंग/इंटरपोलेशन फीचर्स प्राप्त करने के लिए EXECUTE...USING या FORMAT करना होगा। क्या किसी को पता है?
मेरे पास इस फ़ंक्शन के बारे में कई अन्य प्रश्न हैं (क्या यह एक प्रक्रिया होनी चाहिए ताकि मैं लेनदेन का प्रबंधन कर सकूं? मैं इनपुट को किसी भी तरह से कैसे बना सकता हूं? वापसी के लिए एक समझदार परिणाम क्या होगा?) लेकिन मुझे लगता है कि मुझे करना होगा उनका स्वयं के प्रश्नों के रूप में अनुसरण करें।
किसी भी मदद के लिए धन्यवाद!