'ORA-00942: table or view does not exist' 仅当 运行 在存储过程中时
'ORA-00942: table or view does not exist' only when running within a Stored procedure
对于 PL-SQL 的人来说,这应该很容易选择。在将此问题标记为重复之前,请确保虽然错误消息可能很常见,但潜在问题与上一个问题相同。如果是这样,请为已解决的确切逻辑重复问题提供 link。我
当我登录到我的模式时,我执行以下 PL-SQL 代码:
DECLARE
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat;
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
END;
/
查询成功执行,RPT_PER_KEY
的最大值被写入 Toad 中的输出 Window。
但是,当我在过程中执行基本相同的代码时。
CREATE OR REPLACE PROCEDURE hd_purge_test
IS
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(stat.rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
--HD_INVC_LN_ITEM_DTL_STAT
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hd_purge_test;
我收到一条错误消息,提示 table 不存在。
[Warning] ORA-24344: success with compilation error
14/21 PL/SQL: ORA-00942: table or view does not exist
9/4 PL/SQL: SQL Statement ignored
(1: 0): Warning: compiled but with compilation errors
由于我可以使用相同的凭据查询 table,这证明我的 ID 可以从 table 访问 select。我不应该有权从我在相同登录模式下创建的存储过程中查询 table 吗?是否需要执行一些额外的赠款?
注意:如果我从登录模式中的任何 table select,程序编译成功。
听起来像是 select 通过角色而不是直接授予架构的权限的问题。参见 ORA-00942: table or view does not exist (works when a separate sql, but does not work inside a oracle function)。
检查您的用户是否有直接授权访问 table 而不是 'grant select to xxx_role'
你能执行下面的命令然后再次编译你的程序吗:
--GRANT ALL ON <YOUR TABLE NAME> TO <YOUR USER NAME>;
GRANT ALL ON RXFINODS_STA.HD_INVC_LN_ITEM_DTL_STAT TO chadD;
这将授予对该对象的完全权限。
或者您可以这样做:
CREATE OR REPLACE PROCEDURE hd_purge_test
AUTHID CURRENT_USER
IS
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(stat.rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
--HD_INVC_LN_ITEM_DTL_STAT
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hd_purge_test;
对于 PL-SQL 的人来说,这应该很容易选择。在将此问题标记为重复之前,请确保虽然错误消息可能很常见,但潜在问题与上一个问题相同。如果是这样,请为已解决的确切逻辑重复问题提供 link。我
当我登录到我的模式时,我执行以下 PL-SQL 代码:
DECLARE
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat;
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
END;
/
查询成功执行,RPT_PER_KEY
的最大值被写入 Toad 中的输出 Window。
但是,当我在过程中执行基本相同的代码时。
CREATE OR REPLACE PROCEDURE hd_purge_test
IS
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(stat.rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
--HD_INVC_LN_ITEM_DTL_STAT
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hd_purge_test;
我收到一条错误消息,提示 table 不存在。
[Warning] ORA-24344: success with compilation error
14/21 PL/SQL: ORA-00942: table or view does not exist
9/4 PL/SQL: SQL Statement ignored
(1: 0): Warning: compiled but with compilation errors
由于我可以使用相同的凭据查询 table,这证明我的 ID 可以从 table 访问 select。我不应该有权从我在相同登录模式下创建的存储过程中查询 table 吗?是否需要执行一些额外的赠款?
注意:如果我从登录模式中的任何 table select,程序编译成功。
听起来像是 select 通过角色而不是直接授予架构的权限的问题。参见 ORA-00942: table or view does not exist (works when a separate sql, but does not work inside a oracle function)。
检查您的用户是否有直接授权访问 table 而不是 'grant select to xxx_role'
你能执行下面的命令然后再次编译你的程序吗:
--GRANT ALL ON <YOUR TABLE NAME> TO <YOUR USER NAME>;
GRANT ALL ON RXFINODS_STA.HD_INVC_LN_ITEM_DTL_STAT TO chadD;
这将授予对该对象的完全权限。
或者您可以这样做:
CREATE OR REPLACE PROCEDURE hd_purge_test
AUTHID CURRENT_USER
IS
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(stat.rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
--HD_INVC_LN_ITEM_DTL_STAT
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hd_purge_test;