Oracle调试技术

时间:2010-09-17 00:33:02

标签: sql oracle debugging oracle-sqldeveloper

当触发器无法正常工作时,我不知道错误信息的位置。

我编写触发器的工具是Oracle的Sql Developer工具,我对如何调试它的知识几乎不存在。能够找到有关“幕后”事件的有用信息的一些指示是什么?另外,Sql Developer是否有更好的工具用于连接,测试,调试等?

到目前为止,我的方法是编写一些东西(例如一个触发器),用单个插入/删除来测试它,然后希望它能在它们上面工作。有没有更好的方法来确保它完全符合您的要求?例如,使用select语句,无论如何都可以看到(在调试状态或某事物中)每个级别的选择以及它如何淡化结果?任何提示都非常感激。

6 个答案:

答案 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)

按照以下步骤在Oracle PL / SQL中进行DEBUG触发

  1. 使用“编辑”选项打开触发器。通过单击行号设置断点(请参见下文)。 enter image description here
  2. 打开测试窗口,如下所示。
  3. 为您的表写“插入/更新”查询。 (注意:您的触发器可以设置为更新/插入或同时设置)
  4. 单击“启动调试器”按钮。

enter image description here

表中的值将立即更新。调试器将带您触发。在哪里可以继续进行调试。

enter image description here

相关问题