加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 16:24:15 所属栏目:百科 来源:网络整理
导读:我有这样的存储过程 CREATE OR REPLACE PROCEDURE schema_name.CHECKSIS 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'
我有这样的存储过程
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)将显示调用用户可以直接或通过当前活动角色授予用户的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读