如何在 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 中声明具有特定列名的行文字?的主要内容,如果未能解决你的问题,请参考以下文章