Прежде всего, что именно вы передаете функции? Ваш оператор SELECT
показывает, что вы передаете строчную строку 'pqr'. Но жирным шрифтом вы передаете строку верхнего регистра 'PQR'. Так как имена таблиц хранятся в верхнем регистре в словаре данных в верхнем регистре (если только вы не использовали идентификаторы в кавычках и не указали имя таблицы в нижнем регистре) и поскольку вы не используете UPPER
в своем запросе, это важное отличие.
Во-вторых, какова цель вашего обработчика исключений? Нет смысла отлавливать исключение, которое вы не можете обработать, и просто вызываете dbms_output
, который клиент может или не может включить или не прочитать из буфера, в который dbms_output
пишет. Удалите обработчик исключений и посмотрите, не возникла ли ошибка.
В-третьих, код, выполняемый в хранимой процедуре определения прав, которая не имеет доступа к привилегиям, предоставляемым через роли. Он имеет доступ только к привилегиям, предоставленным непосредственно владельцу процедуры. Если владельцу процедуры был предоставлен доступ к рассматриваемым таблицам через роль, вы можете запросить ALL_TAB_COLS
в сеансе SQL * Plus напрямую и просмотреть таблицы, но не в том случае, если запрос был внутри хранимой процедуры с определением прав. В SQL * Plus вы можете отключить роли для имитации привилегий, к которым у вас будет доступ, в хранимой процедуре определения прав
SQL> set role none
, а затем повторите операцию. Если вы больше не видите ожидаемые данные в ALL_TAB_COLS
, вам нужно предоставить владельцу процедуры доступ к таблицам напрямую, а не через роль. Кроме того, вы можете предоставить пользователю доступ к представлению DBA_TAB_COLS
через привилегию SELECT ANY DICTIONARY
и изменить код для использования DBA_TAB_COLS
.