我正在尝试创建一个运行多个PL / SQL语句的过程,但我还没有走得太远。如果我从一个过程中运行它,select语句工作正常,但如果我尝试在一个程序中执行它 - 它找不到shttran表。我猜这可能是一个架构问题,但我不知道如何纠正。想法?
CREATE OR REPLACE PROCEDURE REGREPORTUSER.findUnsent
IS
BEGIN
INSERT INTO regreportuser.maltran (maltran.maltran_key,
maltran.maltran_sent)
SELECT shttran.shttran_id || shttran.shttran_seq_no AS maltran_key,
'No' AS maltran_sent
FROM saturn.shttran -- This is the table it can't find
WHERE TO_DATE (shttran.shttran_activity_date) > SYSDATE - 14
AND shttran.shttran_user = 'WWW2_USER'
AND shttran.shttran_id || shttran.shttran_seq_no NOT IN
(SELECT maltran.maltran_key FROM regreportuser.maltran);
END findUnsent;
答案 0 :(得分:4)
最有可能的问题是,拥有存储过程的用户REGREPORTUSER
可以通过角色而不是直接授权访问表saturn.shttran
。定义者权限存储过程不能使用通过角色授予定义者的权限。它只能使用直接授予的权限。
您可以通过在SQL * Plus会话中禁用角色来验证这实际上是问题所在。如果您运行命令
SQL> set role none;
然后尝试执行SQL语句,你应该得到同样的错误。为了解决问题,您需要直接提供补助
GRANT SELECT ON saturn.shttran
TO REGREPORTUSER