调试
1:存储过程右键:add debug information
2:存储过程右键:test
3:点击小窗口左上角 start debugger
4:开始右边的debug,正常程序调试,在存储过程的代码里点击左边行号还可以设置断点。
跨库授权
如果存储过程中涉及多个库的表,有时会提示权限不足,oracle存储过程分为两种:DR(Definer's Rights) Procedure 和IR(Invoker's Rights) Procedure.以下两段话为转载:
1:定义者权限:定义者权限PL/SQL程序单元是以这个程序单元拥有者的特权来执行它的,也就是说,任何具有这个PL/SQL程序单元执行权的用户都可以访问程序中的对象。所有具有执行权的用户都有相同的访问权限,在定义者权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指定的对象。在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。
2:调用者权限:调用者权限是指当前用户(而不是程序的创建者)执行PL/SQL程序体的权限。这意味着不同的用户对于某个对象具有的权限很可能是不同的,这个思想的提出,解决了不同用户更新不同表的方法。在调用者权限下,执行的用户操作的schema为当前用户,所操作的对象是当前模式下的对象。在调用者(invoker)权限下,当前用户的权限为当前所拥有的权限(含角色)。
** 所以 **
ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显式授权。
执行sql和pl/sql的默认情况下,都是以定义者权限执行的,这也是我们最常用的权限模式,例如在存储过程中调用其他用户的表,但是定义存储过程的当前用户没有显示访问该表的权限,即使当前用户具有dba角色,编译过程中也会出现权限不足的问题,因为role无效。显示授权需要更换用户给当前用户授权
--例子,其中ZI_BJ为需要授权的用户,授予ZH_TEMP3下的DIM_REPORT_XZQH权限
GRANT SELECT ON ZH_TEMP3.DIM_REPORT_XZQH TO ZI_BJ;