您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關PostgreSQL中VARIADIC函數如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1、示例
CREATE OR REPLACE FUNCTION test_v(p1 int, VARIADIC p2 any[]) RETURNS void AS $test_v$ BEGIN NULL; END; $test_v$ LANGUAGE plpgsql;
這里,VARIADIC參數必須是數組,而數組
2、使用
調用方式1
SELECT test_v(1,2,3);
調用方式2
SELECT test_v(1,VARIADIC '{2,3,4}'::int[]);
第一種方式其實在語義層會轉換成第二種方式,這些邏輯在函數 ParseFuncOrColumn
中,有興趣可以自行查看。
3、第二種調用方式的語法
| func_name '(' VARIADIC func_arg_expr opt_sort_clause ')' { FuncCall *n = makeFuncCall($1, list_make1($4), @1); n->func_variadic = true; n->agg_order = $5; $$ = (Node *)n; } | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')' { FuncCall *n = makeFuncCall($1, lappend($3, $6), @1); n->func_variadic = true; n->agg_order = $7; $$ = (Node *)n; }
只是指定這是VARIADIC函數調用,參數并沒有特別處理。
4、實際參數列表
在語法層,第一張調用方式有三個常量參數:整型 整型 整型,而第二種則是兩個參數:整型 整型數組。第一種調用方式在上邊說的 ParseFuncOrColumn
函數中,后兩者合并為一個參數:數組表達式(ArrayExpr)。
5、不能多種參數類型混合
我們可以實現 func(int, int, int ...)
,但無法實現 func(int, text, int, text ...)
,數組不允許這么做,在語義層就會報錯無法繼續。
當然,這個限制并不會影響我們使用PG,并不會因為它函數就沒法定義。主要的影響是遷移,比如Oracle應用會用到decode這樣的函數,在現有機制下,并沒有比較完美的方案去實現。
6、PL/pgSQL
文檔中似乎沒有提到PL/pgSQL對VARIADIC參數的支持(也許有,沒仔細看),但它是可以處理的。而且從上邊看,VARIADIC參數最后傳遞的是一個數組而已,不是什么特別的東西。
回歸測試中的示例:
-- test variadic functions create or replace function vari(variadic int[]) returns void as $$ begin for i in array_lower($1,1)..array_upper($1,1) loop raise notice '%', $1[i]; end loop; end; $$ language plpgsql;
看完上述內容,你們對PostgreSQL中VARIADIC函數如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。