2016-02-25 33 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 | 
+----+ 
相关问题