在Derby DB中插入触发器之前

时间:2017-11-04 12:29:26

标签: mysql sql database javafx derby

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

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.

有人可以帮我这个!我找不到任何与德比有类似问题的地方。

1 个答案:

答案 0 :(得分:0)

我想你想要: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;