मैं अपना दिमाग खो रहा हूँ। SQL सर्वर में, एक संग्रहीत कार्यविधि बनाना बहुत सरल है। एक सरल संरचना है, आप इसे परिभाषित करते हैं, और बनाते हैं। किया हुआ। पोस्टग्रेज में हालांकि, मैंने फ़ंक्शन या संग्रहीत कार्यविधि बनाने के लिए सिंटैक्स पर बहुत सारे बदलाव देखे हैं, और मुझे अभी तक एक भी बनाने में सक्षम नहीं होना है। मुझे हमेशा त्रुटियां मिलती हैं। हमेशा। किसी भी उदाहरण पर मैंने ऑनलाइन कोशिश की है।

नीचे दिया गया उदाहरण इस त्रुटि के साथ विफल रहता है:

[Sep 3, 2020 12:26 PM] 42601: unterminated dollar-quoted string at or near "$$ DECLARE _schemaname text; _tablename text; _key text; _value text; _columns text[]; _values text[]; BEGIN SELECT pg_namespace.nspname, pg_class.relname INTO STRICT _schemaname, _tablename FROM pg_class JOIN pg_namespace ON (pg_namespace.oid = pg_class.relnamespace) WHERE pg_class.oid = $1; FOR _key IN SELECT columns.column_name FROM information_schema.columns WHERE columns.table_schema = _schemaname AND columns.table_name = _tablename ORDER BY columns.ordinal_position LOOP EXECUTE format($s$SELECT format('%%L', ((($1)::%s).%I))$s$, $1, _key) USING $2 INTO STRICT _value"

मुझे नहीं पता कि इसे कैसे हल किया जाए। मैंने कुछ खोज की, और स्क्रिप्ट के ऊपर और नीचे $$ को $BODY$ में बदलने के सुझाव की कोशिश की, लेकिन यह उसी त्रुटि के साथ विफल हो गया। मैं क्या गलत कर रहा हूं?

यहाँ संग्रहीत कार्यविधि है जैसा कि किसी अन्य वेबसाइट पर परिभाषित किया गया है।

CREATE OR REPLACE FUNCTION create_insert_statement(regclass, anyelement) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
_schemaname text;
_tablename text;
_key text;
_value text;
_columns text[];
_values text[];
BEGIN
SELECT pg_namespace.nspname, pg_class.relname
INTO STRICT _schemaname, _tablename
FROM pg_class
JOIN pg_namespace
    ON (pg_namespace.oid = pg_class.relnamespace)
WHERE pg_class.oid = $1;

FOR _key IN
    SELECT columns.column_name
    FROM information_schema.columns
    WHERE columns.table_schema = _schemaname
      AND columns.table_name = _tablename
    ORDER BY columns.ordinal_position
LOOP
    EXECUTE format($s$SELECT format('%%L', ((($1)::%s).%I))$s$, $1, _key) USING $2 INTO STRICT _value;
    _columns := _columns || _key;
    _values := _values || _value;
END LOOP;
RETURN format('INSERT INTO %s (%s) VALUES (%s)', $1, array_to_string(_columns, ','), array_to_string(_values, ','));
END;
$$;
0
JamesMatson 3 सितंबर 2020, 05:31

2 जवाब

सबसे बढ़िया उत्तर

आप गलत डेटाबेस क्लाइंट का उपयोग कर रहे हैं, क्योंकि फ़ंक्शन ठीक है।

शायद आपका क्लाइंट डॉलर के उद्धरण के लिए हिप नहीं है और सोचता है कि SQL कथन फ़ंक्शन बॉडी में पहले अर्धविराम के साथ समाप्त होता है।

आप डॉलर के उद्धरण से बचने की कोशिश कर सकते हैं और सिंगल कोट्स को दोगुना और चौगुना कर सकते हैं, या आप बेहतर क्लाइंट सॉफ़्टवेयर का उपयोग कर सकते हैं।

1
Laurenz Albe 3 सितंबर 2020, 06:18

आप एक टूटे हुए क्लाइंट का उपयोग कर रहे हैं, जैसे HeidiSQL, जो आपके द्वारा दर्ज किए गए टेक्स्ट को डेटाबेस में ट्रांसमिट करने से पहले मैनेज करता है।

0
jjanes 3 सितंबर 2020, 06:25