我正在尝试从Aquastudio创建触发器,并最终遇到以下错误。
CREATE TRIGGER VO.ADMIN_TOOL_T02
AFTER
DELETE
ON VO.ADMIN_TOOL
REFERENCING
OLD AS OLD
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
INSERT INTO VO.ADMIN_TOOL_AUD(
TOOL_URI_X,
MIGRATED_F,
STATUS_X,
UPDATED_LOGIN_NM,
LAST_USE_TS,
UPDATED_GUID_X,
UPDATED_TS,
ACTION_C)
VALUES(old.TOOL_URI_X,
old.MIGRATED_F,
old.STATUS_X,
old.UPDATED_LOGIN_NM,
old.LAST_USE_TS,
old.UPDATED_LOGIN_NM,
CURRENT TIMESTAMP,
'D');
END;
错误如下:
描述错误:无法禁用执行计划:“ SYSTOOLS.EXPLAIN_OPERATOR”是未定义的名称。SQLCODE = -204,SQLSTATE = 42704,DRIVER = 3.67.28
[错误]脚本行:1-10 ------------------------- 在“ RENT TIMESTAMP,'I')“之后找到了意外的令牌” END-OF-STATEMENT“。预期的令牌可能包括:“” .. SQLCODE = -104,SQLSTATE = 42601,DRIVER = 3.67.28
[已执行:8/14/2018 6:25:14 AM] [执行:0ms]
[错误]脚本行:11-12 ------------------------ 在“ END”之后发现意外的令牌“ END-OF-STATEMENT” “。预期的令牌可能包括:“ JOIN” .. SQLCODE = -104,SQLSTATE = 42601,DRIVER = 3.67.28
[已执行:8/14/2018 6:25:14 AM] [执行:0ms]
如果我删除BEGIN ATOMIC,则END起作用。根据公司标准,我需要包括它们,并使我的Aqua Studio能够使用这些设置。 请指教。
答案 0 :(得分:1)
这是一个常见问题。当您有一个多语句块(用户定义函数,复合原子SQL,触发器,存储过程...)时,您需要告诉Db2-server内部语句分隔符和整体语句分隔符之间的区别。在您的示例中,触发器(插入)中只有一个语句,但是每个语句可以有很多用来分隔; (例如),但该块的终止定界符必须为其他字符。
通常人们使用;语句内定界符使用分号,替代语句定界符使用不同的字符,例如@(或!等)。
执行此操作的方法因您使用的工具(GUI或命令行等)而异。查看您的GUI工具的设置,并学习如何做。
对于Aqua Data Studio v19,请单击“文件”>“选项”>“常规”,然后查看“ @在行尾终止语句”,然后勾选该框,然后单击“确定”以应用更改。如果愿意,还可以使用“ /行尾终止语句”。
还要检查您的站点是否使用了已经有此类定界符/终止符标准的自动生成工具,因为您随后应该使用相同的字符。这将允许脚本和GUI都使用相同的定界符。如果脚本处理器是通过-#SET TERMINATOR方法的Db2 CLP,则SQL脚本还可以动态选择替代分隔符。
答案 1 :(得分:0)