Postgresql 如何从pl/pgsql中的深层UDT访问阵列?
我有一个正在处理的存储过程,它使用一组复合类型来返回我之前使用的4个不同查询。我遇到的问题是解决了一些元素没有按预期工作的问题。给定如下类型结构:Postgresql 如何从pl/pgsql中的深层UDT访问阵列?,postgresql,plpgsql,Postgresql,Plpgsql,我有一个正在处理的存储过程,它使用一组复合类型来返回我之前使用的4个不同查询。我遇到的问题是解决了一些元素没有按预期工作的问题。给定如下类型结构: CREATE TYPE mytype3 ( field1 TEXT, field2 TEXT ); CREATE TYPE mytype2 ( field1 INTEGER, field2 mytype3[] ); CREATE TYPE mytype1 ( field1 TEXT, field2 mytype2[] ); 我如何处理一个特定的“m
CREATE TYPE mytype3 ( field1 TEXT, field2 TEXT );
CREATE TYPE mytype2 ( field1 INTEGER, field2 mytype3[] );
CREATE TYPE mytype1 ( field1 TEXT, field2 mytype2[] );
我如何处理一个特定的“mytype3”元素?我希望是这样的:
CREATE FUNCTION get_item( IN n VARCHAR(64) )RETURNS mytype1 AS $$
DECLARE
iid INTEGER;
r RECORD;
output mytype1;
BEGIN
iid=(SELECT id FROM idlist WHERE name=n LIMIT 1);
SELECT field1, NULL FROM table1 WHERE id=iid LIMIT 1 INTO output;
SELECT array( SELECT (field2, NULL) FROM table2 WHERE id=iid)
AS foo INTO output.field2;
FOR r IN SELECT id,field1,field2 FROM table3 WHERE id=iid LOOP
output.field2[r.id].field2 :=
array_append(output.field2[r.id].field2, (r.field1, r.field2));
END LOOP;
RETURN output;
END
$$ LANGUAGE plpgsql STABLE;
但这在第一个数组索引处似乎有语法错误。我已经阅读了很多文档和谷歌搜索,但似乎没有任何东西进入到如此复杂的UDT中。这是PLpgSQL中真正缺失的功能。assign语句不支持复杂的左半部分表达式。左侧可以是记录或复合类型的字段或数组字段。但这一组合不受支持。您应该使用辅助变量:
DECLARE
var1 customtype;
var2 customtype[];
BEGIN
...
FOR r IN SELECT ...
-- left part can be (only these simple variants are supported)
var1.field := ..
var2[r.id] := ..
此外,您的代码是错误的-a)您正在使用类型(mytypex)作为字段名。b) 您的类型是循环的-mytype1使用mytype2,mytype2使用mytype1
请参阅-Assignment-如前所述,通过发送到主数据库引擎的SQL SELECT命令来计算此类语句中的表达式。表达式必须生成单个值(如果变量是行或记录变量,则可能是行值)。目标变量可以是简单变量(可以选择使用块名限定)、行或记录变量的字段,或者是简单变量或字段的数组元素。可以使用Equal(=)代替PL/SQL兼容:=
PLpgSQL语言是一种非常静态的语言,使用太多的嵌套结构是一种不好的做法(在旧的PG上,超过9.5可能会非常慢)。woops!那件事对我来说是个错误,更正了。我不明白a)点,你能澄清一下吗?output.mytype2[r.id].mytype3-mytype2,mytype3是类型,而不是字段。