Подозрительная часть такова:
SELECT DISTINCT
...
, так как пахнет , как известная проблема с привилегиями. Если таблицы, которые вы использовали в предложении FROM
вышеприведенного утверждения, принадлежат не вам, а кому-то другому, и вы приобрели select
(или любые другие) привилегии через роль , что ж, выиграл не работает в именованных процедурах PL / SQL. Да, это хранимая процедура, или функция, или - package
, которую вы написали.
Решение заключается в предоставлении этих привилегий непосредственно вам, а не через роль.
[РЕДАКТИРОВАТЬ: запуск вашего кода в моей базе данных - без ошибок]
SQL> create or replace package my_refresh_pkg as
2 procedure create_first_table;
3 end my_refresh_pkg;
4 /
Package created.
SQL> create or replace package body my_refresh_pkg as
2 procedure create_first_table is
3 begin
4 begin
5 execute immediate 'Drop Table my_table';
6 exception
7 when OTHERS then
8 if sqlcode = -942 then
9 null;
10 end if;
11 end;
12 begin
13 execute immediate 'Create Table my_table as
14 WITH
15 sub_qy AS(
16 SELECT DISTINCT
17 job from emp
18 )
19 SELECT * FROM sub_qy';
20 end;
21 execute immediate 'GRANT SELECT ON my_table to my_role';
22 end create_first_table;
23 end my_refresh_pkg;
24 /
Package body created.
SQL> create role my_role;
Role created.
Тестирование:
SQL> exec my_refresh_pkg.create_first_table;
PL/SQL procedure successfully completed.
SQL> select * From my_table;
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
SQL>