Невозможно выбрать из dba_tab_cols из хранимой процедуры (PL / SQL) - PullRequest
5 голосов
/ 29 апреля 2009

Я пытаюсь выбрать из представления dba_tab_cols из хранимой процедуры. Это не работает, и я не знаю почему.

Если я выполняю следующий SQL в качестве запроса:

SELECT t.data_type FROM dba_tab_cols t
WHERE 
    t.table_name = 'ACCOUNTTYPE' AND 
    t.column_name = 'ACCESSEDBY';

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

SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
    t.table_name = 'ACCOUNTTYPE' AND 
    t.column_name = 'ACCESSEDBY';

Я получаю сообщение об ошибке «PL / SQL: ORA-00942: таблица или представление не существует», и редактор выделяет dba_tab_cols при попытке компиляции. В обоих случаях используется один и тот же пользователь БД.

dataType объявлен как: dataType varchar2 (128);

PL / SQL (Oracle 9)

Кто-нибудь знает проблему?

Ответы [ 3 ]

11 голосов
/ 29 апреля 2009

Скорее всего, это проблема привилегий. Является ли разрешение на доступ к dba_tab_columns через роль или это право прямого выбора для вашего пользователя? Привилегии, предоставляемые через роли, недоступны в SPROCS.

Беглый взгляд на Google предлагает вместо этого использовать all_tab_cols и посмотреть, содержит ли эта таблица необходимую информацию.

4 голосов
/ 29 апреля 2009

Добавить к ответу Эоина:

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

Если пользователь таблицы пытается скомпилировать это процедура, он получает ORA-00942 хотя эта таблица, безусловно, существует и ему было предоставлено право выбора этот стол. Проблема в том, что процедуры не уважают роли; только непосредственно предоставленные права соблюдаются. Таким образом, это означает, что владелец таблицы должен предоставьте право выбора:

http://www.adp -gmbh.ch / ора / ERR / ora_00942.html

0 голосов
/ 29 апреля 2009

У меня не установлен оракул, но возможно dataType - зарезервированное слово. Я бы попробовал что-нибудь еще.

...