sql - 如何在Firebird中使用触发器中的光标进行删除?

标签 sql cursor firebird database-trigger

我尝试在Firebird中编写一个触发器,以便当我从表中删除记录时自动从其他表中删除记录。就像级联删除一样。由于某些原因,有些表没有主键。

触发器就像这样:

CREATE TRIGGER TRG1_DEL_STEP_INFO FOR STEP_INFO
ACTIVE AFTER DELETE
AS
DECLARE VARIABLE del_ID_IMAGE_INFO bigint;
DECLARE VARIABLE del_ID_FRAME_INFO bigint;

DECLARE del_cursor CURSOR FOR (SELECT ID_IMAGE_INFO, ID_FRAME_INFO FROM OLD);

    BEGIN

       OPEN del_cursor;

       WHILE (ROW_COUNT > 0) DO

         BEGIN

           FETCH del_cursor INTO del_ID_IMAGE_INFO, del_ID_FRAME_INFO;

             DELETE FROM FRAME_POLYGON WHERE ID_FRAME_INFO = :del_ID_FRAME_INFO;

             DELETE FROM FRAME_INFO WHERE RECID = :del_ID_FRAME_INFO;

             DELETE FROM IMAGE_INFO WHERE RECID = :del_ID_IMAGE_INFO;

             DELETE FROM IMAGE_FILE_INFO WHERE ID_IMAGE_INFO = :del_ID_IMAGE_INFO;

          END

         CLOSE del_cursor;
    END

但是当我尝试通过 isql 将其放入我的 Firebird DB 时,我收到了如下错误:

Statement failed, SQLSTATE = 42S02
Dynamic SQL Error
-SQL error code = -204
-Table unknown
-OLD
-At line 6, column 73

您能告诉我如何解决这个问题吗?

最佳答案

您不能为此使用游标,也不需要游标。 Firebird 中的触发器是按行触发的,而不是按语句触发的。

所以你应该这样做:

CREATE TRIGGER TRG1_DEL_STEP_INFO FOR STEP_INFO
ACTIVE AFTER DELETE
AS
BEGIN
    DELETE FROM FRAME_POLYGON WHERE ID_FRAME_INFO = OLD.ID_FRAME_INFO;
    DELETE FROM FRAME_INFO WHERE RECID = OLD.ID_FRAME_INFO;
    DELETE FROM IMAGE_INFO WHERE RECID = OLD.ID_IMAGE_INFO;
    DELETE FROM IMAGE_FILE_INFO WHERE ID_IMAGE_INFO = OLD.ID_IMAGE_INFO
END

关于sql - 如何在Firebird中使用触发器中的光标进行删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960286/

相关文章:

php - 如何将自定义类型数组传递给 Postgres 函数

mysql - 在同一列上使用多个 WHERE 范围条件进行选择

android - 到达光标时,Android应用程序崩溃

java - Spring hibernate java.sql.SQLException : The result set is closed

firebird - 带 Pyramid 的独立 web2py-DAL - 请求、线程和内存

sql - 选择时间戳大于时区的位置

sql - 在 Sybase SQL 中连接简单字符串的意外结果

Python(Mysql 连接器)-如何刷新光标上的结果

windows - 启用鼠标阴影的脚本?

c# - Visual Studio 2015 中用于 Firebird 的 ADO.NET 数据提供程序