【问题标题】:How to declare rows literal with specific column names in pl/pgsql?如何在 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') 是从应用层构建的。

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 2016-08-26
        • 2012-08-08
        • 2018-02-10
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        相关资源
        最近更新 更多