Pl/pgSQL EXECUTE ifadəsində $1 parametri yoxdur

Bunu həll edə bilmirəm:

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;

Çalışarkən

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

növbəti mesajı qaytarın:

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

*** Xəta ***

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 mənbə


Cavablar (1)


Burada bir neçə probleminiz var. Dərhal problem budur:

XƏTA: $1 parametri yoxdur

Bu ona görə baş verir ki, EXECUTE-a təhvil verdiyiniz SQL daxilində $1 əsas funksiya gövdəsindəki $1 ilə eyni deyil. EXECUTE SQL daxilində nömrələnmiş yertutanlar funksiyanın kontekstində deyil, EXECUTE kontekstindədir, ona görə də bu yertutanlar üçün EXECUTE üçün bəzi arqumentlər təqdim etməlisiniz:

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

Dinamik Əmrlərin İcrası bölməsinə baxın. ətraflı məlumat üçün təlimat.

Növbəti problem RETURNS integer funksiyanızdan heç nə qaytarmamağınızdır. Nə qayıtmaq fikrində olduğunuzu bilmirəm, amma ola bilsin ki, sizin tablea nömrənizdə geri qaytarmaq istədiyiniz SERIAL id var. Əgər belədirsə, onda buna bənzər bir şey istəyirsiniz:

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

funksiyanızda.

person mu is too short    schedule 10.10.2013
comment
@mu çox qısadır: Bu mənim SQL funksiyamda aldığım eyni xətadır. Mən bunu həll edə bilmədim, bəlkə bəzi göstərişləriniz var? -Təşəkkürlər! stackoverflow.com/ suallar/19918385/ - person jO.; 14.11.2013