为什么我在这个执行语句中已经存在关系?

时间:2014-09-24 08:49:16

标签: postgresql plpgsql execute

这里的功能是:

CREATE OR REPLACE FUNCTION get_img(ptype text, pid integer, pdpi integer)
  RETURNS bytea AS
$BODY$
declare psize char(1); pimg bytea;
begin
    select size into psize from dpi_size where dpi in(select max(dpi) from dpi_size where dpi <= pdpi);
    select coalesce(psize, 's') into psize;

    if ptype = 'cat' then
        execute 'select img_' || psize || ' into pimg from cat where id = $1' using pid;
    end if;

    return pimg;

end; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION get_img(text, integer, integer)
  OWNER TO postgres;

表cat有img_s,img_m,img_l和id。这是我运行select时得到的结果。

select handyman_get_img ('cat', 11, 320)
  

错误:关系&#34; pimg&#34;已存在语境:SQL语句&#34;选择   img_l来自cat的pimg,其中id = $ 1&#34; PL / pgSQL函数   EXECUTE语句中的get_img(text,integer,integer)第8行

任何人都可以告诉我为什么它说&#39; pimg&#39;已经存在?

感谢。

1 个答案:

答案 0 :(得分:1)

您不能在execute的字符串文字中使用变量。

传递给execute的字符串运行&#34;按原样#34;和select .. into pimg from ... an old (non-standard) syntax的作用与create table pimg as select ...相同。

如果要将execute的结果存储到变量中,则需要使用不同的语法:

execute 'select img_' || psize || ' from cat where id = $1' 
        into pimg
        using pid;

注意into如何在正在执行的字符串之外。