我有这样的存储过程
CREATE OR REPLACE PROCEDURE schema_name.CHECKS IS tbl_name VARCHAR2 (50); constraint_nm VARCHAR2 (100); CURSOR cur_constraint IS SELECT DISTINCT table_name,constraint_name FROM all_constraints WHERE constraint_type = 'R' AND STATUS = 'ENABLED' AND R_OWNER = 'owner1' AND r_constraint_name = 'constraint1'; BEGIN DBMS_OUTPUT.put_line ('Constraint Name'); OPEN cur_constraint; LOOP FETCH cur_constraint INTO tbl_name,constraint_nm; EXIT WHEN cur_constraint%NOTFOUND; DBMS_OUTPUT.put_line (constraint_nm||'~~'||tbl_name); END LOOP; close cur_constraint; END CHECKS;
我执行此过程
set serveroutput on BEGIN schema_name.CHECKS (); END;
我得到的输出是
Procedure created. Constraint Name PL/SQL procedure successfully completed.
它没有返回任何结果,但理想情况下它应该返回一行(用于定义游标的select查询将返回一行).
当我像这样执行上面的代码作为PL / SQL块时
DECLARE tbl_name VARCHAR2 (50); constraint_nm VARCHAR2 (100); CURSOR cur_constraint IS SELECT DISTINCT table_name,constraint_name FROM all_constraints WHERE constraint_type = 'R' AND STATUS = 'ENABLED' AND R_OWNER = 'owner1' AND r_constraint_name = 'constraint1'; BEGIN FOR i IN cur_constraint LOOP EXIT WHEN cur_constraint%NOTFOUND; DBMS_OUTPUT.put_line (i.constraint_name||' is in '||i.table_name); END LOOP; END;
它按预期返回一行.
请帮助我理解为什么当逻辑相同时它会表现得很奇怪,除了我执行它的方式.
ALL_CONSTRAINTS有点像镜子.根据对该用户的拨款,每个用户都会看到不同的内容.当作为DEFINE RIGHTS存储过程执行时,它仅显示过程的所有者可以看到由于直接授予所有者(而不是通过角色)的特权的结果.
当作为匿名块执行时,它将显示正在运行的用户可以直接或通过当前活动角色授予用户的权限.
调用者权限存储过程(谷歌AUTHID CURRENT_USER)将显示调用用户可以直接或通过当前活动角色授予用户的内容.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。