用户定义的复合类型文字的语法

时间:2013-05-15 02:15:09

标签: sql postgresql user-defined-types

我的代码中有一些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手册,但没有运气。

1 个答案:

答案 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;