Как объявить строки литеральными с определенными именами столбцов в pl/pgsql?

#postgresql #plpgsql

Вопрос:

Я хочу объявить переменный массив bkgws для таблицы gangwei с именами столбцов подмножества col1 , и col2 вот что я пытаюсь:

 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)