2013-12-17 63 views
0

我試圖創建以下函數。功能已成功創建,但試圖調用它時的投擲錯誤類型EXECUTE在postgresql查詢中不存在

type EXECUTE does not exist!

CREATE OR REPLACE FUNCTION exa(ids text, length integer, fields text) returns text AS 
$BODY$ 
DECLARE 
    chars INT[] := string_to_array(ids, ','); 
    result text := ''; 
    i integer := 0; 
    temp text := ''; 
BEGIN 

    for i in 1..length loop 
     temp := EXECUTE 'SELECT ' || fields || ' from user_index where userid=' || chars[i]; 
      result := result || temp; 
     IF i < length THEN 
      result := result || ',';  
     END IF; 
    end loop; 
    return result; 
END 
$BODY$ language plpgsql; 
+0

嘗試EXEC代替EXECUTE –

+0

@phpdeveloperbalaji沒有運氣 – ray

+1

@phpdeveloperbalaji:「EXEC」只是無稽之談。 –

回答

1

假設fields應該是一個列名。

CREATE OR REPLACE FUNCTION exa(ids text, length integer, fields text 
           ,OUT result text) AS 
$BODY$ 
DECLARE 
    _chars INT[] := string_to_array(ids, ','); 
    i integer := 0; 
    _temp text := ''; 
    _arr text[]; 
BEGIN 
    FOR i IN 1..length loop 
     EXECUTE 'SELECT ' || fields || ' FROM user_index WHERE userid = chars[i]' 
     INTO temp; 
     _arr := _arr || temp; 
    END LOOP; 
    result := array_to_string(result, ','); 

    RETURN; 
END 
$BODY$ language plpgsql; 

真的只是:

CREATE OR REPLACE FUNCTION exa(ids text, fields text, OUT result text) AS 
$BODY$ 
BEGIN 
    EXECUTE 
    format($$SELECT string_agg(%I, ',') 
      FROM user_index 
      JOIN unnest(string_to_array($1, ',')::int[]) i(userid) 
                 USING (userid)$$ 
     ,fields) 
    USING ids 
    INTO result; 
END 
$BODY$ language plpgsql; 

電話:

SELECT exa('10,11,12', 'kat') 

而且一定要避免使用format()%I或其他一些理智的方法SQL注入。嘗試搜索工具。許多類似的答案,在這裏SO - 像這樣的(有更多的解釋和鏈接):
INSERT with dynamic table name in trigger function

+0

超棒的男人!像魔術一樣工作。特別我喜歡較短的版本。 – ray

+0

@ray:應該快很多.. –

+0

不知道爲什麼,但當我試圖執行替代版本時,它拋出以下錯誤: – ray