функция, возвращающая пустую строку при вызове из оператора выбора - PullRequest
0 голосов
/ 01 декабря 2011
CREATE OR REPLACE FUNCTION abc (
p_table_name       IN   VARCHAR2
)
RETURN VARCHAR2
IS
v_var varchar(200);
v_data   VARCHAR2 (4000);

CURSOR cur_column_list
IS
   SELECT column_name AS col_name
    FROM all_tab_cols
   WHERE table_name = p_table_name;
BEGIN
open cur_column_list;
 loop
fetch cur_column_list into v_var;
exit when cur_column_list%notfound;

  v_data := v_data || ' -- ' || v_var;

END LOOP;

RETURN v_data;
EXCEPTION
 WHEN OTHERS
 THEN
 dbms_output.put_line(sqlerrm);
END;
/

При звонке из оператора select

select abc('pqr') FROM DUAL ;

abc('PQR')                                                         
1 row selected.

выход не получен, и pqr содержит 40 столбцов.

1 Ответ

2 голосов
/ 01 декабря 2011

Прежде всего, что именно вы передаете функции? Ваш оператор 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.

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