调试Oracle存储过程或函数的条件
做为一名开发人员,调试自己的程序在工作中很重要的一部分。首先是需要调试的权限,这个权限是:DEBUG CONNECT SESSION
如果没有这个权限,调试按钮会置灰或者报错提示缺少权限
:ORA-0131: Insufficient privileges.
Note: Debugging requires the DEBUG CONNECT SESSION system privilege.
如下图:
但最近在做项目时发生一件怪事,在ST环境可以调试,将脚本部署到了UAT环境后存储过程都不能调试了,并且也不报错,权限都没有问题。今天终于找到原因了,原来是oracle的这个视图导致的:user_plsql_object_settings
例如我在test用户下创建了一个测试函数:
create or replace function F_TEST(i_count number) return varchar2 is Result varchar2(200); begin Result := 'End'; for i in 1..i_count loop dbms_output.put_line(i); end loop; return(Result); end F_TEST;
查询该视图:
22:49:43 TEST@ orcl>col plsql_debug format a20; 22:49:59 TEST@ orcl>/ NAME PLSQL_DEBUG -------------------- -------------------- F_TEST TRUE 已选择 1 行。 已用时间: 00: 00: 00.00 22:50:00 TEST@ orcl>col plsql_debug format a20; 22:50:07 TEST@ orcl>select t.name, t.plsql_debug 22:50:16 2 from all_plsql_object_settings t 22:50:16 3 where t.owner = 'TEST' 22:50:16 4 and t.type = 'FUNCTION' 22:50:16 5 and t.name = 'F_TEST'; NAME PLSQL_DEBUG -------------------- -------------------- F_TEST TRUE 已选择 1 行。
此时函数是允许调试的。
重新编译:
22:50:16 TEST@ orcl>alter function f_test compile plsql_debug=false;
函数已更改。
后重新查询:
22:51:28 TEST@ orcl>select t.name, t.plsql_debug 22:52:19 2 from all_plsql_object_settings t 22:52:19 3 where t.owner = 'TEST' 22:52:19 4 and t.type = 'FUNCTION' 22:52:19 5 and t.name = 'F_TEST'; NAME PLSQL_DEBUG -------------------- -------------------- F_TEST FALSE 已选择 1 行。
再次调试发现无法进入函数内部,而不报错
后记:通常我们都是用PL/SQL做为调试工具,今天介绍下Oracle官方提供的Oracle SQL Developer如何调试:
1.打开要调试的程序,在要调试的行数上单击,设置断点,这个和MyEclipse的操作是一样的。
2.单击调试按钮
3.弹出调试窗口,注意这个存储过程需要有传入参数,程序默认将入参设置成了NULL,所以需要修改下参数。例如修改成:
NAME:=’Hello’;
修改完后单击确定按钮。
4.剩下的就可以根据自己的需要进行调试了。