2013-10-13 5 views
1

Я новичок в базе данных Oracle 11g R2, это для получения информации о табличном пространстве базы данных. Я бегу следующий код вроде .sql:Вызов таблицы dba по хранимой процедуре

select TABLESPACE_NAME, 
INITIAL_EXTENT, 
NEXT_EXTENT, 
MIN_EXTENTS, 
MAX_EXTENTS, 
PCT_INCREASE, 
STATUS, 
CONTENTS 
    from dba_tablespaces 
    order by TABLESPACE_NAME ; 

и работает нормально, но когда я пытаюсь его запустить в хранимой процедуре:

CREATE OR REPLACE PROCEDURE TABLE_SPACE_INFO AS 
BEGIN 
select TABLESPACE_NAME, 
INITIAL_EXTENT, 
NEXT_EXTENT, 
MIN_EXTENTS, 
MAX_EXTENTS, 
PCT_INCREASE, 
STATUS, 
CONTENTS 
from dba_tablespaces 
order by TABLESPACE_NAME ; 
END TABLE_SPACE_INFO; 

я получил ошибку компиляции:

Error(3,3): PL/SQL: SQL Statement ignored 
Error(11,7): PL/SQL: ORA-00942: table or view does not exist 

Какое решение и почему его неправильно?

+0

возможно дубликат [Oracle 9i: Synonymed таблица не существует] (http://stackoverflow.com/ вопросы/379672/oracle-9i-синонимированный-table-does-not-exist) –

+0

Это не одно и то же. Здесь речь идет о предоставлении роли, которая работает при запуске SQL напрямую, но жалуется при использовании внутри хранимого кода PL/SQL. – igr

ответ

1

Я думаю, вы не имеете прав для доступа к dba_tablespaces. Перед выполнением запроса вы должны предоставить привилегии пользователю или предоставить роль DBA.

0

вы можете использовать пакеты для этого:

create or replace PACKAGE YourPackge AS TYPE T_CURSOR IS REF CURSOR; 
    PROCEDURE TABLE_SPACE_INFO(T_List OUT T_CURSOR); 
    END; 

    \ 

    create or replace PACKAGE BODY YourPackge as 
    PROCEDURE TABLE_SPACE_INFO(T_List OUT T_CURSOR) 
    IS 
    BEGIN 
    OPEN T_List FOR 
    select TABLESPACE_NAME, 
    INITIAL_EXTENT, 
    NEXT_EXTENT, 
    MIN_EXTENTS, 
    MAX_EXTENTS, 
    PCT_INCREASE, 
    STATUS, 
    CONTENTS 
    from dba_tablespaces 
    order by TABLESPACE_NAME ; 
    END TABLE_SPACE_INFO; 
    END; 
+0

Ошибка (7,3): PL/SQL: заявление SQL игнорируется Ошибка (15,11): PL/SQL : ORA-00942: таблица или представление не существует У меня такая же проблема и я использую системного пользователя – Arquitecto

+1

Никогда не используйте пользователя SYSTEM @Arquitecto ... создайте свой собственный и предоставите соответствующие разрешения. – Ben

0

Вы должны явно предоставить выбор на dba_tablespaces себе, чтобы увидеть эту таблицу в пакете. Хранимые процедуры или пакеты не наследуют привилегии пользователя для конкретных объектов. Такие, как:

Test.sql:

create or replace procedure test as 
    ret number; 
BEGIN 
    select count(*) into ret 
    from dba_tablespaces; 
end; 
/

show errors 

Забегая:

SQL> @c:\bob\test 

Warning: Procedure created with compilation errors. 

Errors for PROCEDURE TEST: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/3  PL/SQL: SQL Statement ignored  
5/10  PL/SQL: ORA-00942: table or view does not exist 

SQL> connect sys/[email protected] as sysdba 
Connected. 
SQL> grant select on dba_tablespaces to myuser; 

Grant succeeded. 

SQL> connect myuser/[email protected] 
Connected. 
SQL> @c:\bob\test 

Procedure created. 

No errors. 
SQL> 
+0

Добро пожаловать в SO. Это хороший ответ с помощью подхода show-as-you-explain. Чтобы завершить его, просто добавьте примечание об AUTHID CURRENT_USER. – igr

Смежные вопросы