Pl/pgSQL EXECUTE स्टेटमेंटमध्ये कोणतेही पॅरामीटर $1 नाही

मी हे सोडवू शकत नाही:

CREATE OR REPLACE FUNCTION dpol_insert(
    dpol_cia integer, dpol_tipol character, dpol_nupol integer,
    dpol_conse integer,dpol_date timestamp)
  RETURNS integer AS
$BODY$
    DECLARE tabla text := 'dpol'||EXTRACT (YEAR FROM $5::timestamp);
BEGIN
    EXECUTE '
    INSERT INTO '|| quote_ident(tabla) ||' 
    (dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)
    ';
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

प्रयत्न करताना

SELECT dpol_insert(1,'X',123456,1,'09/10/2013')

पुढील संदेश परत करा:

ERROR:  there is no parameter $1
LINE 3: ...tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$...
                                                             ^
QUERY:  
    INSERT INTO dpol2013 
    (dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)

CONTEXT:  PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement

*** त्रुटी ***

ERROR: there is no parameter $1
SQL state: 42P02
Context: PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement

person stefmex    schedule 10.10.2013    source स्रोत


उत्तरे (1)


तुम्हाला येथे काही समस्या आहेत. तात्काळ समस्या आहे:

त्रुटी: कोणतेही पॅरामीटर $1 नाही

असे घडते कारण $1 SQL मध्ये जे तुम्ही EXECUTE ला देत आहात ते मुख्य फंक्शन बॉडीमध्ये $1 सारखे नाही. EXECUTE SQL मधील क्रमांकित प्लेसहोल्डर हे EXECUTE च्या संदर्भात आहेत, फंक्शनच्या संदर्भात नाही म्हणून तुम्हाला त्या प्लेसहोल्डरसाठी EXECUTE करण्यासाठी काही वितर्क पुरवावे लागतील:

execute '...' using dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date;
--            ^^^^^

मध्ये डायनॅमिक कमांड कार्यान्वित करणे पहा तपशीलांसाठी मॅन्युअल.

पुढील समस्या अशी आहे की तुम्ही तुमच्या फंक्शनमधून काहीही परत करत नाही जे RETURNS integer. मला माहित नाही की तुमचा काय रिटर्न करायचा आहे पण कदाचित तुमच्या tablea ची SERIAL id आहे जी तुम्हाला परत करायची आहे. तसे असल्यास, तुम्हाला यासारखे काहीतरी हवे आहे:

declare
    tabla text := 'dpol' || extract(year from $5::timestamp);
    id integer;
begin
    execute 'insert into ... values ($1, ...) returning id' into id using dpol_cia, ...;
    --                                        ^^^^^^^^^^^^  ^^^^^^^
    return id;
end

आपल्या कार्यात.

person mu is too short    schedule 10.10.2013
comment
@mu खूप लहान आहे: माझ्या SQL फंक्शनमध्ये हीच त्रुटी आहे. मी ते सोडवू शकलो नाही, कदाचित तुमच्याकडे काही पॉइंटर्स असतील? -धन्यवाद! stackoverflow.com/ प्रश्न/19918385/ - person jO.; 14.11.2013