2016-06-22 73 views
1

在PostgreSQL 9.1,我需要一個表名作爲參數傳遞給我的功能在遊標中使用 - 然後調用的功能等:如何傳遞遊標的表名作爲函數參數?

select myfunction('tableA'); 

或:

select myfunction('tableB') 

我有試試這個:

create or replace function myfunction(sid text) 
returns integer as $BODY$ 
declare 
     bids cursor is select id from sid; --line 4 
begin 
     for bid in bids loop 
      --some logic 
     end loop; 
     return 1; 
end; 
$BODY$ 
language plpgsql volatile; 

我得到error on line 4。而且我明白了,不允許將表名作爲函數參數傳遞給允許休息的地方(選擇,投影)。

是否有替代方案來實現這一目標?

回答

3

只有值可以在SQL命令中被參數化,而不是標識符或關鍵字。目前它僅適用於SELECTINSERT,UPDATEDELETE命令。詳細信息:

您需要在PLPGSQL EXECUTE動態SQL。
將它與隱含的FOR循環的遊標結合使用,該循環通常比顯式遊標更簡單快捷。 Instructions in the manual.

我也建議使用regclass參數安全地通過有效表名

CREATE OR REPLACE FUNCTION myfunction(_tbl regclass) 
    RETURNS int AS 
$func$ 
DECLARE 
    bid integer; -- appropriate data type! 
BEGIN 
    FOR bid IN EXECUTE 
     'SELECT id FROM ' || _tbl 
    LOOP 
     -- statements can use bid 
     RAISE NOTICE '%', bid; 
    END LOOP; 

    RETURN 1; 
END 
$func$ LANGUAGE plpgsql; 

電話:

SELECT myfunction('tableA'); -- careful: case sensitive! 

更多的解釋:

而且通常情況下,有一個更快的基於集合的解決方案,並不需要循環的所有。


如果你正需要一個光標,聲明未綁定的遊標OPEN FOR EXECUTE打開它:

CREATE OR REPLACE FUNCTION myfunction(_tbl text) -- could be regclass again 
    RETURNS int AS 
$func$ 
DECLARE 
    _bids refcursor; 
    _rec record; 
BEGIN 
    OPEN _bids FOR EXECUTE 'SELECT id FROM ' || quote_ident(_tbl); -- text must be escaped 

    LOOP 
     FETCH NEXT FROM _bids INTO _rec; 
     EXIT WHEN _rec IS NULL; 

     -- some logic 
     RAISE NOTICE '%', _rec.id; 
    END LOOP; 

    RETURN 1; 
END 
$func$ LANGUAGE plpgsql; 

相同認購。在此密切相關的答案更多細節:

+0

我嘗試這樣做。實際上我想使用遊標的輸入(在聲明塊中)。 – Spike

+0

@Spike:我添加了另一個答案如何使用遊標來做到這一點。 –

+0

工作正常。謝謝。 – Spike

相關問題