【问题标题】:Trigger prevents insertion of data into table触发器防止将数据插入表中
【发布时间】:2018-11-29 17:13:53
【问题描述】:

我有以下问题: 我正在尝试将数据插入表中,但是我的触发器阻止我执行插入。我的触发器是在输入给定的 'year'

" 错误:查询没有结果数据的目的地 提示:如果您想丢弃 SELECT 的结果,请改用 PERFORM。 CONTEXT: PL/pgSQL function funcaotriggerxx() line 5 at SQL statement "

触发

CREATE FUNCTION funcaoTriggerXX() RETURNS trigger AS $valor$
DECLARE
    cod INT;
BEGIN
    SELECT codigolivro 
    FROM edicao
    WHERE ano < '2000';

    cod = codigolivro;

    INSERT INTO log (codigolivro) VALUES (cod);

    RETURN cod;
END;
$valor$ LANGUAGE plpgsql;

CREATE TRIGGER codigoLivros AFTER INSERT ON edicao
EXECUTE PROCEDURE funcaoTriggerXX();

程序

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

选择

SELECT seculoxx();

插入

INSERT INTO edicao (codigolivro, numero, ano) VALUES ('1325','4','1990');

表格的结构也很简单: 教育学院

  • 代码(数字)
  • 版本(字符)
  • 年份(整数)

日志

  • codigolivro

有人可以帮我吗?

【问题讨论】:

    标签: postgresql function stored-procedures triggers insert


    【解决方案1】:

    首先,您的触发器函数说它返回trigger (NULL/OLD/NEW),而实际上它返回INTEGER。然后正如错误所说,你不能在没有目的地的 plpgsql 函数中执行 SELECT 。换句话说,您需要将SELECT 语句的结果分配给一个变量。

    SELECT codigolivro 
        INTO cod
    FROM edicao
    WHERE ano < '2000';
    

    您的seculoxx() 函数很好,但不需要中间变量:

    RETURN count(*)
    FROM edicao
    WHERE ano < 2000;
    

    【讨论】:

      【解决方案2】:

      查看funcaoTriggerXXseculoxx 中的选择查询有何不同。当您想要存储来自选择查询的值时,您需要SELECT column_name INTO variable_name。当您不想保存结果时,您需要使用PERFORM。例如。 PERFORM SELECT ....

      您的语言与代码的功能之间也存在差异。那就是你说:

      我的触发器是在输入给定的“年份”

      我想你的意思是 codigolivro 代表刚刚插入的行。然而,就目前而言。如果edicao 表中的any 行满足该条件,则此触发器实质上将插入带有year &lt; 2000 的随机行。 相反,您可以使用NEW 特殊变量来获取刚刚插入的行,并且您可以使用CREATE TRIGGERWHEN 子句来控制触发器何时触发。

      由于您只关心刚刚插入的行(而不是整个表中的所有行),那么您可以使用NEW 特殊变量。

      CREATE FUNCTION funcaoTriggerXX() RETURNS trigger AS $valor$
      BEGIN
          INSERT INTO log (codigolivro) VALUES (NEW.codigolivro);
          RETURN NEW;
      END;
      $valor$ LANGUAGE plpgsql;
      
      CREATE TRIGGER codigoLivros AFTER INSERT ON edicao
          FOR EACH ROW
          WHEN (NEW.ano < 2000)
          EXECUTE PROCEDURE funcaoTriggerXX();
      

      【讨论】:

      • 非常感谢您的帮助,我现在正在学习这些功能,您的提示将对以后的问题有用!
      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2021-04-05
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多