У меня есть пользовательский тип:
CREATE TYPE public.relacion AS
(id integer,
codpadre character varying,
codhijo character varying,
canpres numeric(7,3),
cancert numeric(7,3),--this is usually NULL
posicion smallint);
После этого мне нужен другой тип из relacion
type:
CREATE TYPE public.borrarrelacion AS
(idborrar integer,
paso integer,
rel relacion);
Ну, теперь в функцию мне нужно скопироватьнесколько строк из таблицы типа relacion
в таблицу типа borrarrelacion
:
Это фрагмент моего кода:
DECLARE:
r relacion%ROWTYPE;
------------
BEGIN
EXECUTE FORMAT ('CREATE TABLE IF NOT EXISTS "mytable" OF borrarrelacion (PRIMARY KEY (idborrar))');
EXECUTE FORMAT ('SELECT * FROM %I WHERE codpadre = %s AND codhijo = %s',
tablarelacion,quote_literal(codigopadre),quote_literal(codigohijo)) INTO r;
EXECUTE FORMAT ('INSERT INTO "mytable" VALUES(0,0,%s)',r);
Но я получаю сообщение об ошибке, поскольку поле r.cancert
NULL, и он пытается вставить что-то вроде этого:
INSERT INTO "mytable" VALUES(0,0,(0,'cod1','cod2',10,,0));
Я могу решить эту проблему, прочитав каждое поле r
и поместив его значения в оператор INSERT, например:(и изменяя значение NULL на 0)
EXECUTE FORMAT ('INSERT INTO "mytable" VALUES(0,0,(%s,%s,%s,%s,%s,%s))',
r.id,quote_literal(r.codpadre),quote_literal(r.codhijo),r.canpres,COALESCE(r.cancert,0),r.posicion);
Но я хотел бы знать, могу ли я избежать этого, и могу ли я вставить одну и ту же строку из одной таблицы в другую.