2012-11-23 44 views
2

在postgres 9.1中,我想創建一個函數,該函數採用索引名稱,表名和可變數量的列,構造一個索引,然後執行其他一些操作。在plpgsql中,如何使用可變數量的標識符創建並執行命令字符串?

我目前的做法是使用PLPGSQL並構建一個動態的命令來執行。然而,當我嘗試使用quote_ident來保護所有的標識符時,我會被絆倒。代碼迄今:

ERROR: too few arguments for format 

我在做什麼錯了:通過一個名字的時候,但是有兩個或更多的我收到以下錯誤

CREATE OR REPLACE FUNCTION my_create_index(indexname text, tablename text, VARIADIC arr text[]) RETURNS void AS $$ 
    DECLARE 
    command_string text; 
    BEGIN 
    command_string := 'CREATE INDEX ' || quote_ident(indexname) || ' ON ' || 
     quote_ident(tablename) || ' (' || 
     format(repeat('%I ', array_length($3, 1)), VARIADIC $3) || 
     ')'; 

    -- display the string 
    RAISE NOTICE '%', command_string; 

    -- execute the string 
    EXECUTE command_string; 

    -- (do other stuff) 
    END; 
$$ LANGUAGE plpgsql; 

的代碼似乎是成功的? (據推測一些與format或我使用VARIADIC

謝謝!

+0

我想你可能已經。發現了一個bug,請參閱答案 –

回答

3

你一般不會同時使用formatquote_identformat足夠聰明地做引用自己的標識符;你在表達自己的部分內容的同時,在別處使用不必要的連接和呼叫。

但是,我看到了與format調用VARIADIC數組參數相同的問題,並且我懷疑您發現了一個錯誤。

這裏有一個解決辦法,直到我發現這是怎麼回事:

command_string := format('CREATE INDEX %I ON %I (%s)', 
    indexname, tablename, (
     SELECT string_agg(quote_ident(x), ', ') 
     FROM unnest($3) x 
    ) 
); 

注意,在你的原代碼,'%I '應該已經'%I, '

是的,錯誤確認,並it's been reported before但看起來它從來沒有得到的檢查。 concatconcat_ws中存在相同的錯誤。這些函數無法檢查參數標誌VARIADIC

觀察:

regress=> SELECT format('%I', VARIADIC ARRAY['b','c','d']); 
    format 
----------- 
"{b,c,d}" 
(1 row) 

regress=> SELECT format('%I', 'b','c','d'); 
format 
-------- 
b 
(1 row) 

regress=> SELECT format('%I, %I, %I', VARIADIC ARRAY['b','c','d']); 
ERROR: too few arguments for format 

我能想到的要麼避免它們(如上圖所示),或者使用EXECUTE動態構造函數調用的唯一解決方法。在format的情況下,這是完全多餘的,所以我只需要使用unnest的上述子查詢。

我會盡力在PostgreSQL郵件列表上追逐這個問題,但下週我會瘋狂地忙碌,所以捅我或在pgsql-bugs上張貼一個鏈接回到這個問題上,如果你不喜歡在接下來的一週中,我們不會看到後續的情況。

+0

感謝您的非常透徹的答覆,我真的很感激,是的,我沒有必要使用這兩種格式,並連接到一起, – brahn

3

不能在格式功能使用可變參數的參數現在:(。這是一個已知的錯誤,將被固定在PostgreSQL的9.3(我希望),你可以嘗試使用補丁http://archives.postgresql.org/message-id/[email protected]om

+0

更新的修補程序張貼在這裏的良好的出發點:!HTTP://archives.postgresql。 org/message-id/[email protected]om –

+0

進一步補丁更新和跟蹤歷史可以在這裏找到:HTTPS://commitfest.postgresql。org/action/patch_view?id = 970 –

+0

它在9.3中得到了修復devel –

相關問題