如何在 pl/pgsql 中声明具有特定列名的行文字?

Posted

技术标签:

【中文标题】如何在 pl/pgsql 中声明具有特定列名的行文字?【英文标题】:How to declare rows literal with specific column names in pl/pgsql? 【发布时间】:2021-11-26 04:26:07 【问题描述】:

我想为表gangwei 声明一个数组变量bkgws,其子集列名称为col1col2,这是我尝试的方法:

DO $$
  DECLARE
    bkgws gangwei(col1, col2)[] := ('fo1','bar1'),('fo2','bar2'); -- here, syntax error
BEGIN
  INSERT INTO gangwei (config_id, col1, col2) SELECT 1, col1, col2 FROM unnest(bkgws);
END;$$;

提供gangwei的所有列都是id, config_id, col1, col2

文字('fo1','bar1'),('fo2','bar2') 是从应用层构建的。

【问题讨论】:

【参考方案1】:

你需要先通过命令CREATE TYPE AS创建复合类型

CREATE TYPE gangwei AS (col1 varchar, col2 varchar);

DO $$
DECLARE
  bkgws gangwei[] DEFAULT '"(foo, bar)", "(foo2, bar2)"';
  r record;
BEGIN
  FOR r IN SELECT * FROM unnest(bkgws)
  LOOP
    RAISE NOTICE '% %', r.col1, r.col2;
  END LOOP;
END;
$$;
 
NOTICE:  foo  bar
NOTICE:  foo2  bar2
DO

【讨论】:

【参考方案2】:

unpack数组时需要指定列名:

... FROM unnest(bkgws) AS arr(col1,col2)

【讨论】:

以上是关于如何在 pl/pgsql 中声明具有特定列名的行文字?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pl/pgsql 将具有动态元素名称的 JSON 数据转换为行?

如何从 C++ 代码调用 PL/pgSQL 函数

如何在 PL/pgSQL 中按行类型返回表

PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询

在 PL/PGSQL 动态 SQL 内部函数中引用局部变量

如何纠正 PL/pgSQL 中缺少引用的“一对多表”?