2014-09-24 54 views
0

這裏的功能:爲什麼我在這個執行語句中已經存在關係?

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; 

表貓有img_s,img_m,IMG_L和ID。這是我運行select時得到的結果。

select handyman_get_img ('cat', 11, 320) 

ERROR: relation "pimg" already exists CONTEXT: SQL statement "select img_l into pimg from cat where id = $1" PL/pgSQL function get_img(text,integer,integer) line 8 at EXECUTE statement

誰能賜教爲什麼它說 'PIMG' 已存在?

謝謝。

回答

1

對於execute,您不能在字符串文字中使用變量。

傳遞給execute的字符串運行「原樣」和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是如何正在執行字符串之外。

+0

謝謝。您的格式有效。但是,如果select into創建一個臨時表,那麼當我不使用'execute'語句時,如何'已經存在'錯誤不會出現,並且只需將select img_l寫入pimg中...? – black 2014-09-24 11:09:24

+0

@Sebouh:因爲第一個'select'不是一個字符串文字,而是一個由PL/pgSQL引擎執行的「嵌入式」選擇 - 它理解'into'用於變量而不是新表格。 – 2014-09-24 11:13:05

+0

有意義。感謝您的解釋。 – black 2014-09-24 11:14:14

相關問題