oracle – 存储过程没有返回正确的结果

前端之家收集整理的这篇文章主要介绍了oracle – 存储过程没有返回正确的结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这样的存储过程
  1. CREATE OR REPLACE PROCEDURE schema_name.CHECKS
  2. IS
  3. tbl_name VARCHAR2 (50);
  4. constraint_nm VARCHAR2 (100);
  5. CURSOR cur_constraint
  6. IS
  7. SELECT DISTINCT table_name,constraint_name
  8. FROM all_constraints
  9. WHERE constraint_type = 'R'
  10. AND STATUS = 'ENABLED'
  11. AND R_OWNER = 'owner1'
  12. AND r_constraint_name = 'constraint1';
  13. BEGIN
  14. DBMS_OUTPUT.put_line ('Constraint Name');
  15. OPEN cur_constraint;
  16. LOOP
  17. FETCH cur_constraint
  18. INTO tbl_name,constraint_nm;
  19. EXIT WHEN cur_constraint%NOTFOUND;
  20. DBMS_OUTPUT.put_line (constraint_nm||'~~'||tbl_name);
  21. END LOOP;
  22. close cur_constraint;
  23. END CHECKS;

我执行此过程

  1. set serveroutput on
  2.  
  3. BEGIN
  4. schema_name.CHECKS ();
  5. END;

我得到的输出

  1. Procedure created.
  2. Constraint Name
  3. PL/sql procedure successfully completed.

它没有返回任何结果,但理想情况下它应该返回一行(用于定义游标的select查询将返回一行).

当我像这样执行上面的代码作为PL / sql块时

  1. DECLARE
  2. tbl_name VARCHAR2 (50);
  3. constraint_nm VARCHAR2 (100);
  4. CURSOR cur_constraint
  5. IS
  6. SELECT DISTINCT table_name,constraint_name
  7. FROM all_constraints
  8. WHERE constraint_type = 'R'
  9. AND STATUS = 'ENABLED'
  10. AND R_OWNER = 'owner1'
  11. AND r_constraint_name = 'constraint1';
  12. BEGIN
  13. FOR i IN cur_constraint
  14. LOOP
  15. EXIT WHEN cur_constraint%NOTFOUND;
  16. DBMS_OUTPUT.put_line (i.constraint_name||' is in '||i.table_name);
  17. END LOOP;
  18. END;

它按预期返回一行.

请帮助我理解为什么当逻辑相同时它会表现得很奇怪,除了我执行它的方式.

ALL_CONSTRAINTS有点像镜子.根据对该用户的拨款,每个用户都会看到不同的内容.当作为DEFINE RIGHTS存储过程执行时,它仅显示过程的所有者可以看到由于直接授予所有者(而不是通过角色)的特权的结果.

当作为匿名块执行时,它将显示正在运行的用户可以直接或通过当前活动角色授予用户的权限.

调用者权限存储过程(谷歌AUTHID CURRENT_USER)将显示调用用户可以直接或通过当前活动角色授予用户内容.

猜你在找的Oracle相关文章