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

How to declare rows literal with specific column names in pl/pgsql?

我想为 table 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') 是从应用程序层构建的。

您需要先通过命令创建复合类型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

unpack数组时需要指定列名:

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