我可能在形成字面量时做错了什么。假设我有一个像这样的简单存储过程:
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/