我已经创建了一个视图,并试图为它创建一个插入规则。
这是我的代码:
CREATE VIEW v_Telecontagem AS
SELECT
Fonte.id AS id,
Fonte.nome AS fonte_nome,
Fonte.tipo_fonte AS fonte_tipo_fonte,
Telecontagem.id_fornecedor AS telecontagem_id_fornecedor,
Telecontagem.fornecedor AS telecontagem_fornecedor,
Telecontagem.nome AS telecontagem_nome,
Telecontagem.id_fonte AS telecontagem_id_fonte
FROM Telecontagem
INNER JOIN Fonte ON Telecontagem.id_fonte = Fonte.id;
CREATE RULE v_Telecontagem_INSERT AS ON INSERT TO v_Telecontagem DO INSTEAD (
INSERT INTO Fonte (id, nome, tipo_fonte) VALUES (DEFAULT, NEW.fonte_nome, NEW.fonte_tipo_fonte)
RETURNING id INTO NEW.telecontagem_id_fonte;
INSERT INTO Telecontagem (id_fornecedor, fornecedor, nome, id_fonte)
VALUES (NEW.telecontagem_id_fornecedor, NEW.telecontagem_fornecedor, NEW.telecontagem_nome, NEW.telecontagem_id_fonte)
);
我的插入分为两步,首先插入
Fonte
表,然后插入Telecontagem
表。为此,我需要“存储”第一次插入的新
id
,因此我尝试使用RETURNING id INTO NEW.telecontagem_id_fonte
。但是PgSQL抱怨说
INTO
在RETURNING
之后是不需要的:ERROR: syntax error at or near "INTO" at character ...
我不能在
RULE
中使用这个吗?如果无法存储新创建的id
,我如何执行此插入操作? 最佳答案
所以,解决方案是使用这样一个触发器:
CREATE OR REPLACE FUNCTION v_Telecontagem_func()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO Fonte (id, nome, tipo_fonte) VALUES (DEFAULT, NEW.fonte_nome, NEW.fonte_tipo_fonte) RETURNING id INTO NEW.telecontagem_id_fonte;
INSERT INTO Telecontagem (id_fornecedor, fornecedor, nome, id_fonte) VALUES (NEW.telecontagem_id_fornecedor, NEW.telecontagem_fornecedor, NEW.telecontagem_nome, NEW.telecontagem_id_fonte);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
-- UPDATE HERE
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
-- DELETE HERE
RETURN NULL;
END IF;
RETURN NEW;
END;
$function$;
CREATE TRIGGER v_Telecontagem__trig
INSTEAD OF INSERT OR UPDATE OR DELETE ON
v_Telecontagem FOR EACH ROW EXECUTE PROCEDURE v_Telecontagem_func();
基本上,对于同一视图,我现在使用函数和触发器在
INSERT
、UPDATE
和DELETE
上执行函数。关于sql - PgSQL无法编译RETURNING…INTO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49786534/