oracle存储过程中的错误

Sas*_*kar 2 oracle stored-procedures compilation

我在Oracle中执行存储过程时遇到问题.

以下是存储过程:

CREATE OR REPLACE Procedure xxxlist
    (yyyid in NUMBER)    
IS
    xid number(6);
    cursor c1 is select distinct xxxID from MXS.Y where YID=yyyid;
BEGIN
IF NOT c1%ISOPEN THEN 
    OPEN c1;
END IF;
LOOP
    FETCH c1 into xid;
    dbms_output.put_line(TO_CHAR(xid));
    EXIT WHEN c1%NOTFOUND; 
END LOOP;
CLOSE c1;   
END;
Run Code Online (Sandbox Code Playgroud)

当我创建存储过程时,我收到以下错误:

Warning: Procedure created with compilation errors.
Run Code Online (Sandbox Code Playgroud)

我执行以下命令为我提供有关上述抽象错误消息的更多详细信息.

SHO ERR;
Run Code Online (Sandbox Code Playgroud)

我得到以下详细信息以响应上述命令:

Errors for PROCEDURE XXXLIST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/18     PL/SQL: SQL Statement ignored
5/52     PL/SQL: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

现在,我知道表名或sql查询本身存在问题.因此,我尝试在PRODECURE之外单独执行SQL查询,以查看表或查询的内容.

select distinct xxxID from MXS.Y where YID=yyyid;
Run Code Online (Sandbox Code Playgroud)

但是,我发现上述查询没有任何问题.查询运行正常,我得到了正确的结果.

所以,我不知道为什么程序在执行时遇到问题.有人可以帮忙吗?

Dav*_*sta 7

可能的解释是,您运行的帐户已被授予通过角色访问该表的权限.在Oracle中,通过角色授予的访问权限会影响独立的SQL语句,但不会影响PL/SQL中嵌入的SQL语句.

如果是这种情况,表(或DBA)的所有者必须直接向您的帐户授予对表的选择访问权限:

GRANT SELECT ON mxs.y TO <account>;
Run Code Online (Sandbox Code Playgroud)