sql - 将复合类型的数组传递给存储过程

标签 sql postgresql stored-procedures plpgsql

我可能在形成字面量时做错了什么。假设我有一个像这样的简单存储过程:

CREATE OR REPLACE FUNCTION do_something(input_array composite_type[])
  RETURNS SETOF text AS
$BODY$
DECLARE
    temp_var composite_type;
BEGIN

    FOR temp_var IN SELECT unnest(input_array) LOOP
        return next temp_var.message;
    END LOOP;

END
$BODY$
  LANGUAGE plpgsql;

composite_type 定义为:

CREATE TYPE composite_type AS
   (message text,
    amount numeric(16,2));

执行这样的查询:

SELECT * FROM do_something('{"(test,11)","(test2,22)"}')

产生这个结果集:

(test,11.00)
(test2,22.00)

代替:

test
test2

是我的文字有问题还是我应该以不同的方式访问 message 字段?感谢您的任何建议。

最佳答案

您如何指定您的输入看起来很好,因为使用行和数组构造函数语法观察到相同的行为:

SELECT * FROM do_something( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );

和:

SELECT ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[];

产生:

 '{"(test,11.00)","(test2,22.00)"}'

如果你添加:

 RAISE NOTICE '!%!',temp_var;

在循环内输出是:

NOTICE:  !("(test,11.00)",)!
NOTICE:  !("(test2,22.00)",)!

显示您实际上得到了一个元组,其中“消息”作为您期望的元组文本和一个空的“数量”。

所以。为什么?

这有点微妙。您正在使用:

SELECT unnest(input_array)

这似乎做你想做的,对吧:

regress=>     SELECT unnest( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );
    unnest     
---------------
 (test,11.00)
 (test2,22.00)
(2 rows)

...但实际上,它返回 composite_type 类型的单列。 PL/PgSQL 复合类型赋值期望每个类型列一列。所以单个 col 被插入“消息”并且没有第二个 col。

相反,写:

SELECT * FROM unnest(input_array)

解压复合 Material 以进行分配。然后它按预期工作:

regress=> SELECT * FROM do_something( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );
 do_something 
--------------
 test
 test2
(2 rows)

如果 composite_type 的第一个字段是非文本类型,您会收到一个错误,该错误提供更多信息。

关于sql - 将复合类型的数组传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21914227/

相关文章:

mysql - 更新加入 -> 插入 NULL

mysql - 无法在 MySQL 上创建 View

json - Postgres 多对多 JSON 聚合

python - ArrayField 返回错误值

sql - 过程、函数或触发器中不允许使用 use 语句

mysql - Sql Count 包含一些值的行

mysql - SQL通过使用同一个表组合3个查询

postgresql - 如何在 Postgres 事件触发器中获取更改表的名称?

sql - 比较存储过程性能 ex 和新版本

java - 通过 java (MS SQL) 中的存储过程提取 XML 自动数据