Таблица существует в хранимой процедуре при использовании в операторе select, но не при использовании в операторе Insert

Моя хранимая процедура выглядит так:

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 не существует.

Я совсем запутался - что здесь не так?


person Tpk43    schedule 20.07.2018    source источник


Ответы (1)


Select * from another_schema.Dw_table

У вас нет права выбирать из этой таблицы. Даже если вы думаете, что это так (предоставлено через роль), это не будет работать в хранимых процедурах — вы должны предоставить это напрямую пользователю, к которому вы подключены.

Кроме того, нет смысла сначала усекать таблицы, а затем удалять их. Просто бросьте их.

Кроме того, редко возникает необходимость создавать таблицы динамически (так, как вы это делаете), особенно глобальные временные таблицы. Создайте их один раз, используйте их много раз. Без падений. Не создавать (повторно) их в PL/SQL.

person Littlefoot    schedule 20.07.2018