Процедура Oracle - PullRequest
       1

Процедура Oracle

2 голосов
/ 30 марта 2011
create or replace function gen.sample_func(owner varchar2) return varchar2 
    as 
     data_t varchar2(10); 
      cursor cur is   select  data_type  from  SYS.DBA_TAB_COLUMNS;
      begin  
        open cur;
          dbms_output.put_line('Done'); 
        close cur; 
        return data_t;  
    end sample_func;

При компиляции вышеуказанной функции я получаю следующую ошибку

Warning: compiled but with compilation errors
Errors for FUNCTION sample_func

LINE/COL                                                                        
--------------------------------------------------------------------------------
ERROR                                                                           
--------------------------------------------------------------------------------
4/8                                                                             
PLS-00201: identifier 'DBA_TAB_COLUMNS' must be declared                        

4/8                                                                             
PL/SQL: Item ignored                                                            

7/15                                                                            
PLS-00320: the declaration of the type of this expression is incomplete or malfo
rmed                                                                            

7/8                                                                             
PL/SQL: Statement ignored                                                       

Я не получаю эту ошибку, когда выполняю только оператор select в курсоре.Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

9 голосов
/ 30 марта 2011

Вашему пользователю необходимо предоставить SELECT ON DBA_TAB_COLUMNS.

Обратите внимание, что предоставление через роль не будет работать - это должно быть прямое предоставление пользователю для создания функции / процедуры.

8 голосов
/ 30 марта 2011

В хранимой процедуре определения прав, такой как та, которую вы создаете, при разрешении имен объектов учитываются только те привилегии, которые предоставляются непосредственно владельцу процедуры.Привилегии, предоставляемые через роли, не учитываются.Держу пари, что владельцу вашей процедуры был предоставлен доступ к представлению DBA_TAB_COLUMNS через роль, а не через прямое предоставление.Вам нужно будет попросить администратора базы данных предоставить доступ к DBA_TAB_COLUMNS непосредственно пользователю, которому принадлежит ваша процедура.

Вы можете быстро проверить, действительно ли это ваша проблема.В SQL * Plus введите команду

SQL> set role none;

и затем запустите оператор SELECT.Если вы получаете ту же ошибку прав доступа, то проблема в том, что у вас есть грант через роль.Отключение ролей означает, что ваш интерактивный сеанс работает с теми же привилегиями, что и хранимая процедура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...