当触发器无法正常工作时,我不知道错误信息的位置。
我编写触发器的工具是Oracle的Sql Developer工具,我对如何调试它的知识几乎不存在。能够找到有关“幕后”事件的有用信息的一些指示是什么?另外,Sql Developer是否有更好的工具用于连接,测试,调试等?
到目前为止,我的方法是编写一些东西(例如一个触发器),用单个插入/删除来测试它,然后希望它能在它们上面工作。有没有更好的方法来确保它完全符合您的要求?例如,使用select语句,无论如何都可以看到(在调试状态或某事物中)每个级别的选择以及它如何淡化结果?任何提示都非常感激。
答案 0 :(得分:14)
首先,所有代码都能正常运行。它只是没有按照你的预期去做。
其次,“不要从这里开始”,或者特别是不要使用触发器。如果触发器将针对每一行触发,它基本上将强制切换到行级处理。最好将逻辑放在您调用的存储过程中。然后,您将获得一个开始(您验证输入的位置)以及一直到结束和逻辑路径。当您遵循一条路径时,它们更容易调试。
三,永远不要测试你不知道如何处理的错误。如果你没有抓住它,它会冒泡到客户端,它会收到一个错误报告,说明出了什么问题(错误信息)和哪里(即错误/调用堆栈)。如果你试图抓住它,你必须知道如何处理它(如果你不知道倾向于忽略它 - 这是不好的。)
最后,您无法轻易看到选择的每个“图层”。解释计划通常会告诉你它的具体情况。 v $ session_longops可以指示它当前正在做什么。当前的等待事件可以提供有关当前正在处理的表/块/行的线索。
答案 1 :(得分:10)
如果必须调试触发器,那么粗略且准备好的简单方法是使用DBMS_OUTPUT。
e.g。
SQL> CREATE OR REPLACE TRIGGER mytrigger
BEFORE UPDATE ON mytable
FOR EACH ROW
...
BEGIN
DBMS_OUTPUT.put_line('mytrigger STARTING');
... do some logic ...
DBMS_OUTPUT.put_line('old=' || :OLD.mycolumn);
DBMS_OUTPUT.put_line('new=' || :NEW.mycolumn);
DBMS_OUTPUT.put_line('mytrigger FINISHED');
END;
/
SQL> SET SERVEROUT ON
SQL> UPDATE mytable SET mycolumn = mycolumn + 1;
2 rows updated.
mytrigger STARTING
old=10
new=11
mytrigger FINISHED
mytrigger STARTING
old=20
new=21
mytrigger FINISHED
答案 2 :(得分:1)
应用 我在www.quest.com/toad/toad-for-oracle.aspx上使用了来自Quest的一个名为TOAD的程序。
如上所述,DBMS_OUTPUT非常方便。在编辑器中,确保启用“输出”窗口。
PL / SQL适用于代码的“块”,您可以使用EXCEPTION关键字捕获它。
(请原谅我的格式,不知道如何格式化网页)
DECLARE
C_DATE_FORMAT VARCHAR2(20) := 'DD-Mon-YYYY';
C_TIME_FORMAT VARCHAR2(20) := 'HH24:MI:SS';
C_NOT_IMPLEMENTED_CODE CONSTANT NUMBER(5) := -20200;
C_NOT_IMPLEMENTED_MESSAGE CONSTANT VARCHAR2(255) := 'Not implemented';
not_implemented EXCEPTION; -- user defined exception
BEGIN
--RAISE not_implemented; -- raise user defined exception
RAISE_APPLICATION_ERROR(C_NOT_IMPLEMENTED_CODE, C_NOT_IMPLEMENTED_MESSAGE); -- user defined exception
EXCEPTION -- exception block
WHEN not_implemented THEN -- catch not_implemented exception
DBMS_OUTPUT.PUT_LINE('Error: Not implemented');
WHEN OTHERS THEN -- catch all other exceptions
DBMS_OUTPUT.PUT_LINE('Error occured.');
DBMS_OUTPUT.PUT_LINE('Date: ' || TO_CHAR(SYSDATE, C_DATE_FORMAT));
DBMS_OUTPUT.PUT_LINE('Time: ' || TO_CHAR(SYSDATE, C_TIME_FORMAT));
DBMS_OUTPUT.PUT_LINE('Error code: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error message: ' || SQLERRM); --deal with error
RAISE; -- raise to calling object
END;
答案 3 :(得分:1)
SQL Developer有一个很好的PL / SQL调试器: http://www.packtpub.com/article/debugging-pl-sql-in-oracle-sql-developer
答案 4 :(得分:1)
dbForge Studio for Oracle中还有一个很好的Oracle debugger工具,包括逐步执行代码,断点,调用堆栈,监视,Oracle存储函数的变量评估机制和程序调试自动化。 / p>
答案 5 :(得分:0)