【问题标题】:Table exists in stored procedure while used in select but not when Used in Insert statement表存在于存储过程中,在 select 中使用但在 Insert 语句中使用时不存在
【发布时间】:2018-07-20 01:51:06
【问题描述】:

我的存储过程是这样的:

create or replace procedure tpk.sp_Test_proc
IS
   err_code      NUMBER;
   err_msg       VARCHAR (500);
   v_tbl_cnt     NUMBER;
   v_tbl_valid   NUMBER;
Begin
SELECT COUNT(*) INTO v_tbl_cnt  FROM USER_TABLES 
  WHERE TABLE_NAME IN (UPPER('Tbl1'),UPPER('tbl2'),UPPER('tbl3'));

IF(v_tbl_cnt =3) THEN

EXECUTE IMMEDIATE 'TRUNCATE TABLE Tbl1';
    EXECUTE IMMEDIATE 'TRUNCATE TABLE Tbl2'; 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE Tbl3';

    EXECUTE IMMEDIATE 'DROP TABLE Tbl1';
    EXECUTE IMMEDIATE 'DROP TABLE Tbl2'; 
    EXECUTE IMMEDIATE 'DROP TABLE Tbl3';

EXECUTE IMMEDIATE
    'CREATE global temporary TABLE tbl1
    ( Id Integer... )'

Insert into tbl1
Select * from another_schema.Dw_table /* In this line it throws error Table does not exist */
end if;
end;

我用存储过程厌倦了同一张表,只是为了获取它在那里工作的数据,但是当我在 Insert 语句中使用它时会抛出一个错误

PL/SQL: ORA-00942 表或视图不存在。

我完全糊涂了——这是怎么回事?

【问题讨论】:

    标签: oracle oracle11g ora-00942


    【解决方案1】:
    Select * from another_schema.Dw_table
    

    您无权从该表中进行选择。即使您认为可以(通过角色授予),它也无法在存储过程中工作 - 您必须直接将其授予您连接的用户。

    此外,先截断表,然后再删除它们是没有意义的。扔掉它们。

    此外,很少需要动态创建表(按照您的方式),尤其是全局临时表。创建一次,多次使用。没有掉落。没有(重新)在 PL/SQL 中创建它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多