Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何从pl/pgsql中的深层UDT访问阵列?_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 如何从pl/pgsql中的深层UDT访问阵列?

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

我有一个正在处理的存储过程,它使用一组复合类型来返回我之前使用的4个不同查询。我遇到的问题是解决了一些元素没有按预期工作的问题。给定如下类型结构:

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是类型,而不是字段。