【问题标题】:Pl/pgSQL there is no parameter $1 in EXECUTE statementpl/pgSQL EXECUTE 语句中没有参数 $1
【发布时间】:2023-03-18 23:14:01
【问题描述】:

我无法解决这个问题:

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

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    这里有几个问题。眼前的问题是:

    错误:没有参数 $1

    发生这种情况是因为您要交给 EXECUTE 的 SQL 中的 $1 与 main 函数体内的 $1 不同。 EXECUTE SQL 中的编号占位符在 EXECUTE 的上下文中,而不是在函数的上下文中,因此您需要为这些占位符提供一些参数给 EXECUTE:

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

    详情请参阅手册中的Executing Dynamic Commands

    下一个问题是你没有从你的函数中返回任何东西RETURNS integer。我不知道您打算返回什么,但也许您的tablea 有一个您想返回的序列号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
    

    在你的函数中。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多