我已经创建了一个视图,并试图为它创建一个插入规则。
这是我的代码:

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抱怨说INTORETURNING之后是不需要的:
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();

基本上,对于同一视图,我现在使用函数和触发器在INSERTUPDATEDELETE上执行函数。

关于sql - PgSQL无法编译RETURNING…INTO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49786534/

10-14 01:45