2015-12-01 18 views
4

我需要獲得從架構表名,除了一些表如何將文本參數傳遞到存儲功能`IN`運營商

CREATE OR REPLACE FUNCTION func(unnecessary_tables TEXT) 
returns void 
as $$ 
begin 
     EXECUTE 'SELECT table_name FROM information_schema.tables 
     WHERE 
     table_schema=''public'' 
     AND 
     table_name NOT IN($1) 
     ' USING unnecessary_tables 

     --here execute retrieved result, etc ... 

end; 
$$language plpgsql 

然後調用函數

select func('table1'',''table2'); 

這不是作品和回報結果table1table2也。

問題是:如何將文本參數傳遞給存儲函數,對於IN運算符?

+0

不應該是'select func('table1,table2');'? –

+0

@ Gabriel's不,我正在嘗試這個,但不能正常工作 – RIKI

+0

您是否試過'SELECT func('''table1'',''table2''');'?我認爲有一個問題。 –

回答

7

傳遞一個文本陣列中,而不是文本:

create or replace function func(unnecessary_tables text[]) 
returns void as $$ 
begin 
    select table_name 
    from information_schema.tables 
    where 
     table_schema = 'public' 
     and 
     not(table_name = any($1)) 
    ; 
end; 
$$language plpgsql  

調用它:

select func(array['t1','t2']::text[]); 

BTW上述代碼可以是純SQL中,而不是PL/pgSQL的

+1

它可以通過'VARIADIC'參數增強 - 然後你可以通過SELECT func('t1','t2')' –

2

要回答你的確切問題(如何傳遞給IN運營商的功能文本)您需要:

SELECT func('''table1'',''table2'''); 

原因是表名必須用字符串,所以他們需要通過裏面的引號。 爲了它的工作原理存在所需的代碼一個變化,我我以前不看的第一:

CREATE OR REPLACE FUNCTION func(unnecessary_tables TEXT) 
returns void 
as $$ 
begin 
     EXECUTE 'SELECT table_name FROM information_schema.tables 
     WHERE 
     table_schema=''public'' 
     AND 
     table_name NOT IN(' || unnecessary_tables || ')'; 

     --here execute retrieved result, etc ... 

end; 
$$language plpgsql 

它是必要的,因爲USING知道的類型,不只是「粘貼」參數代替$1

+0

這個函數來調用這個函數嗎? Iam也嘗試這個,但它不起作用 – RIKI

+0

哦,我沒有注意到你使用'EXECUTE ...使用...'。我編輯了我的答案。 –