考虑这样的功能:
CREATE OR REPLACE FUNCTION public.foo(
string1 character varying
)
RETURNS integer AS
$BODY$
DECLARE
id1 INTEGER;
BEGIN
id1 := (SELECT id FROM mytable WHERE mycolumn = string1);
END;
......
它工作正常,我得到了id1
值,可以在函数的其他部分使用。
现在,我想重写该函数并传递一个名称,该名称的作用类似于表的标识符。
CREATE OR REPLACE FUNCTION public.foo(
string1 character varying,
tablecode character varying --new argument
)
RETURNS integer AS
$BODY$
DECLARE
id1 INTEGER;
BEGIN
.....
现在,我有一些获取id1
值和错误的方法:
EXECUTE FORMAT('id1 := (SELECT id FROM %I WHERE mycolumn = %s)', tablecode||'_Conceptos', quote_literal(string1));
错误:
ERROR: syntax error at or near "id1"
LINE 1: id1 := (SELECT id FROM "CENZANO_Conceptos" WHERE codigo ...
^
QUERY: id1 := (SELECT id FROM "CENZANO_Conceptos" WHERE codigo = 'CENZANO')
-第二次攻击
EXECUTE FORMAT ('SELECT %I.id INTO id1 FROM %I WHERE mycolumn = %s', tablecode||'_Conceptos',tablecode||'_Conceptos',quote_literal(string1));
END;
......
错误:
ERROR: EXECUTE of SELECT ... INTO is not implemented
HINT: You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead.
预先感谢
答案 0 :(得分:1)
您可以使用INTO
:
EXECUTE FORMAT('(SELECT id FROM %I WHERE mycolumn = %s)'
, tablecode||'_Conceptos', quote_literal(string1)) INTO id1;