我有一个自定义类型:
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
类型中的另一种类型:
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);
但是我想知道是否可以避免这种情况,并且可以从一个表到另一表插入完全相同的行。