【问题标题】:Before Insert trigger in Derby DB在 Derby DB 中插入触发器之前
【发布时间】:2018-04-17 01:39:57
【问题描述】:

我正在使用 netbeans 构建一个 javafx 项目,并为此使用 derby 数据库。 我有两张桌子,BOOKISSUE。 我想创建一个BEFORE INSERT trigger ON ISSUE 表来检查BOOK 表中名为“available”的布尔字段的值。 按下时名为 BookIssue 的按钮应检查以下触发器。 如果“available”的值为false,则应弹出警告消息,否则必须执行插入操作。 我无法正确获取触发命令。

String trigger = "CREATE TRIGGER toIssue NO CASCADE BEFORE INSERT ON ISSUE"
            + " FOR EACH ROW"
            + " BEGIN"
            + "     SELECT isAvail from BOOK WHERE id = '"+ bookId + "'"
            + "     IF isAvail = false"
            + "         THEN RAISE_APPLICATION_ERROR(-20001,'Books Out of stock')"
            + "     END IF"
            + " END";
    databasehandler.execQuery(trigger);

我的日志中出现以下异常:

Exception at execQuery:dataHandlerSyntax error: Encountered "BEGIN" at line 1, column 71.

谁能帮我解决这个问题!我找不到任何其他与德比有类似问题的地方。

【问题讨论】:

    标签: mysql sql database javafx derby


    【解决方案1】:

    我想你想要:ExecuteNonQuery()

    另外,这行是可疑的:

    SELECT isAvail from BOOK WHERE id = '"+ bookId + "'"
    

    触发器主体应该看起来更像这样:

    DECLARE v_avail boolean;
    
    SELECT b.isAvail INTO v_avail 
    FROM BOOK b
    WHERE b.id = NEW.ID;
    
    IF NOT v_isAvail THEN
        RAISE_APPLICATION_ERROR(-20001,'Books Out of stock')"
    END IF;
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多