将选择值分配给变量到PostgreSQL 9.3函数中的Execute中

时间:2018-09-08 18:03:03

标签: postgresql

考虑这样的功能:

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.

预先感谢

1 个答案:

答案 0 :(得分:1)

您可以使用INTO

EXECUTE FORMAT('(SELECT id FROM %I WHERE mycolumn = %s)'
                , tablecode||'_Conceptos', quote_literal(string1)) INTO id1;