gpt4 book ai didi

oracle - 存储过程未返回正确结果

转载 作者:行者123 更新时间:2023-12-04 13:54:18 26 4
gpt4 key购买 nike

我有一个这样的存储过程

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存储过程执行时,它仅显示过程所有者由于直接授予所有者特权(而不是通过角色)而可以看到的内容。

当作为匿名块执行时,它将显示由于直接或通过当前 Activity 角色授予用户特权的结果,正在运行的用户可以看到的内容。

调用者权限存储过程(google AUTHID CURRENT_USER)将显示调用用户可以直接或通过当前 Activity 角色授予用户权限而看到的内容。

关于oracle - 存储过程未返回正确结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com