Nat*_*ars 9 sql oracle debugging oracle-sqldeveloper
当触发器无法正常工作时,我不知道错误信息的位置.
我编写触发器的工具是Oracle的Sql Developer工具,我对如何调试它的知识几乎不存在.能够找到有关"幕后"事件的有用信息的一些指示是什么?另外,Sql Developer是否有更好的工具用于连接,测试,调试等?
到目前为止,我的方法是编写一些东西(例如触发器),用单个插入/删除测试它,然后希望它可以从它们开始工作.有没有更好的方法来确保它完全符合您的要求?例如,使用select语句,无论如何都可以看到(在调试状态或某事物中)每个级别的选择以及它如何淡化结果?任何提示非常感谢.
Gar*_*ers 14
首先,所有代码都能正常工作.它只是没有按照你的预期去做.
其次,"不要从这里开始",或者特别是不要使用触发器.如果触发器将针对每一行触发,它基本上将强制切换到行级处理.最好将逻辑放在您调用的存储过程中.然后,您将获得一个开始(您验证输入的位置)以及一直到结束和逻辑路径.当您遵循一条路径时,它们更容易调试.
三,永远不要测试你不知道如何处理的错误.如果你没有抓住它,它会冒泡到客户端,它会收到一个错误报告,说明出了什么问题(错误信息)和哪里(即错误/调用堆栈).如果你试图抓住它,你必须知道如何处理它(如果你不知道倾向于忽略它 - 这是不好的).
最后,您无法轻易看到选择的每个"层".解释计划通常会告诉你它的具体情况.v $ session_longops可以指示它当前正在做什么.当前的等待事件可以提供有关当前正在处理的表/块/行的线索.
Jef*_*emp 10
如果必须调试触发器,那么粗略且准备好的简单方法是使用DBMS_OUTPUT.
例如
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29049 次 |
| 最近记录: |