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
不要使用与列名冲突的变量
我怀疑您想要 null
s 而不是空字符串(指示“缺少”值更有意义)
函数需要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
)
我写了一个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不要使用与列名冲突的变量
我怀疑您想要
null
s 而不是空字符串(指示“缺少”值更有意义)函数需要
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
)