2016-02-25 1301 views
2

我試圖創建一個函數,它將根據提供的文本數組中的ANY進行過濾。該函數引發以下內容:「錯誤:嘗試在pgplsql函數內執行查詢時,數組值必須以」{「或維度信息」開頭「。查詢窗口中運行確切的SQL語句時查詢工作正常。PostgreSQL - 數組值必須以「{」或尺寸信息開頭

下面以簡化樣本說明問題。

鑑於表定義:

CREATE TABLE b 
(
    id serial NOT NULL, 
    item_id character varying(2) NOT NULL, 
    CONSTRAINT b_pkey PRIMARY KEY (id) 
); 

和樣本數據:

id item_id 
1  A 
2  B 
3  D 
4  T 
5  G 
6  T 
7  B 

和功能:

CREATE OR REPLACE FUNCTION get_item_ids() RETURNS integer[] AS 
$BODY$DECLARE 
    qry text; 
    ids integer[]; 
    items text[]; 
BEGIN 
    items := ARRAY['A','B','C']::text[]; 
    qry := format('SELECT id FROM b WHERE item_id = ANY(%L)', items); 
    raise notice '%', qry; 
    execute qry into ids; 
    raise notice 'ids:%', ids; 
    return ids; 
END$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

當功能被執行如下輸出產生:

NOTICE: SELECT id FROM b WHERE item_id = ANY('{A,B,C}') 

ERROR: array value must start with "{" or dimension information 
CONTEXT: PL/pgSQL function get_item_ids() line 9 at EXECUTE statement 

********** Error ********** 
ERROR: array value must start with "{" or dimension information 
SQL state: 22P02 
Context: PL/pgSQL function get_item_ids() line 9 at EXECUTE statement 

複製和粘貼 「SELECT ID選自B WHERE ITEM_ID = ANY( '{A,B,C}')」 語句到查詢窗口產生以下預期的結果:

id integer 
    1 
    7 
    2 

我試圖許多其他選項,包括類型轉換,不同的引用,以及使用array_to_string和unnest函數。任何人都可以解釋發生了什麼,並建議一個可行的替代方案?

回答

2

試試這個聲明自己的函數中:

EXECUTE 'SELECT ARRAY(SELECT id FROM b WHERE item_id = ANY($1))' INTO ids USING items; 
  • 使用USING安全地執行動態語句。此方法優於將數據值作爲文本插入命令字符串(使用format)。
  • 您需要用ARRAY構造函數包裝返回的行以生成integer[](或者重構您的函數以返回SETOF integer,如果這實際上是您想要的 )。
0

鑑於以下功能:

CREATE OR REPLACE FUNCTION get_item_ids(items text[]) RETURNS integer[] AS 
$BODY$ 
BEGIN 
    RETURN ARRAY(SELECT id FROM b WHERE item_id = ANY (items)); 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

下面的查詢:

SELECT get_item_ids('{"A", "B"}'::text[]) 

顯示此:

{1,2,7} 

在另一方面,功能:

CREATE TYPE id_record AS (id integer); 

CREATE OR REPLACE FUNCTION get_item_ids2(text[]) RETURNS SETOF id_record AS 
$BODY$ 
SELECT id FROM b WHERE item_id = ANY ($1); 
$BODY$ 
LANGUAGE SQL VOLATILE; 

查詢:

SELECT id FROM get_item_ids2('{"A", "B"}'::text[]) 

爲您提供:

+----+ 
| Id | 
+----+ 
| 1 | 
| 2 | 
| 7 | 
+----+ 
相關問題