Postgresql 函数调用

Postgresql function invocation

我写了一个postgresql函数,如下所示

CREATE OR REPLACE FUNCTION public."UpdateTx"(IN "instructionId" character varying,IN txdata character varying,IN txdetail character varying,IN txstatus character varying,IN resid character varying,IN "timestamp" bigint)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    VOLATILE
    PARALLEL UNSAFE
    COST 100
    
AS $BODY$DECLARE updateClause varchar;
BEGIN

IF instructionId = '' THEN
    RAISE EXCEPTION 'instruction id is missing';
END IF;
IF txstatus = '' THEN
    RAISE EXCEPTION 'tx status is missing';
END IF;
updateClause := CONCAT('txstatus= ', txstatus);
IF txData != '' THEN
    updateClause = CONCAT(updateClause, ', ', 'txdata=', txdata);
END IF;
EXECUTE 'UPDATE transactions SET  WHERE instructionid=instructionid' USING updateClause;

END;
$BODY$;

所以它需要 5 个 varchar 和 1 个 bigint 作为输入参数。 我尝试执行以下 SQL 查询

Select UpdateTx('123'::varchar, 'test'::varchar, 'test'::varchar, 'test'::varchar, 'test2'::varchar, 4124::bigint)

但是一直显示这个错误信息

ERROR:  function updatetx(character varying, character varying, character varying, character varying, character varying, bigint) does not exist
LINE 1: Select UpdateTx('123'::varchar, 'test'::varchar, 'test'::var...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 8

语法有误吗?

感谢任何建议或答案:)

您的直接问题是您的函数被声明为区分大小写(带有双引号),但您以不区分大小写的方式调用它(不带引号,对于 Postgres,这等同于所有低帽)。只是名字不匹配。

但还有更多:

  • 你传递变量的方式不对;不要将查询的一部分连接到变量 updateClause,您应该为每个需要传递给变量的值传递一个参数 - 但更好的是,您实际上不需要为此动态 SQL

  • 不要使用与列名冲突的变量

  • 我怀疑您想要 nulls 而不是空字符串(指示“缺少”值更有意义)

  • 函数需要return东西

  • 我还注意到您没有使用传递给函数的所有参数

这是一个功能代码,至少可以编译。您可以从那里开始并根据您的具体要求进行调整:

CREATE OR REPLACE FUNCTION public.UpdateTx(
    IN pInstructionId character varying,
    IN pTxdata character varying,
    IN pTxdetail character varying,  -- not used in the function
    IN pTxstatus character varying,  
    IN pResid character varying,     -- not used in the function
    IN pTimestamp bigint            - - not used in the function
)
    RETURNS character varying
    LANGUAGE plpgsql
    VOLATILE
    PARALLEL UNSAFE
    COST 100
AS $BODY$

BEGIN

    IF pInstructionId IS NULL THEN
        RAISE EXCEPTION 'instruction id is missing';
    END IF;

    IF pTxstatus IS NULL THEN
        RAISE EXCEPTION 'tx status is missing';
    END IF;

    UPDATE transactions 
    SET txstatus = pTxstatus, txData = COALESCE(pTxdata, txData) 
    WHERE instructionid = pInstructionId;

    RETURN 1;  -- put something more meaningful here

END;
$BODY$;

您可以按如下方式调用它:

select UpdateTx(
    '123'::varchar, 
    'test'::varchar, 
    'test'::varchar, 
    'test'::varchar, 
    'test2'::varchar, 
    4124::bigint
)

Demo on DB Fiddle