我的代码中有一些UDT(用户定义的类型)(PostgreSQL 9.2)
create type pairs_t as (keyname varchar, e_value varchar);
create type values_t as (e_values varchar[]);
create type allvalues_t as (regions values_t, products pairs_t);
并用于:
create or replace function foo( IN _x allvalues_t[] ) returns void as $$ begin...
应用程序中的实际UDT更复杂。
但我无法弄清楚如何输入测试用例。例如,如果我想要产品(a,prod-a),(b,prod-b)
和区域的(),pgAdmin SQL窗口中的SELECT * from foo(...)
语句将如何显示? ...
应该是什么?
如果有人可以发布描述此语法的指南或页面,我将不胜感激。我查看了postgresql手册,但没有运气。
答案 0 :(得分:1)
查看手册中的CREATE TYPE
。
您的示例定义了类型allvalues_t
,但后来使用了allvalues
。另外values_t
- > value_t
。看起来像一个简单的错别字。如果你想要做对,你就不能那么草率。
复合的语法可以是type:
SELECT * from foo(('{"(\"(\"\"{arr_a,arr_b}\"\")\",\"(foo,bar)\")","(\"(\"\"{arr_a,arr_b}\"\")\",\"(foo,bar)\")"}'))
你怎么能找到自己?
CREATE TEMP TABLE pairs_t (keyname varchar, e_value varchar);
-- OR CREATE TYPE for a more permanent solution.
INSERT INTO pairs_t VALUES ('foo', 'bar');
CREATE TEMP TABLE values_t (e_values varchar[]);
INSERT INTO values_t VALUES ('{arr_a, arr_b}');
CREATE TEMP TABLE allvalues_t (regions values_t, products pairs_t);
INSERT INTO allvalues_t VALUES((SELECT x FROM values_t x), (SELECT x FROM pairs_t x));
CREATE TEMP TABLE test (t allvalues_t[]);
INSERT INTO test VALUES (ARRAY[(SELECT x FROM allvalues_t x), (SELECT x FROM allvalues_t x)]);
SELECT * FROM test
SELECT x FROM allvalues_t x;