#oracle #stored-procedures #dbms-output
Вопрос:
Я хотел напечатать значение определенной переменной, которая находится внутри анонимного блока. Я использую Oracle SQL Developer. Я пробовал использовать dbms_output.put_line
. Но это не работает. Код, который я использую, показан ниже.
SET SERVEROUTPUT ON DECLARE CTABLE USER_OBJECTS.OBJECT_NAME%TYPE; CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE; V_ALL_COLS VARCHAR2(500); CURSOR CURSOR_TABLE IS SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OBJECT_NAME LIKE 'tb_prm_%'; CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2) IS SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = V_TABLE_NAME; BEGIN OPEN CURSOR_TABLE; LOOP FETCH CURSOR_TABLE INTO CTABLE; EXIT WHEN CURSOR_TABLE%NOTFOUND; OPEN CURSOR_COLUMNS (CTABLE); V_ALL_COLS := NULL; LOOP FETCH CURSOR_COLUMNS INTO CCOLUMN; V_ALL_COLS := V_ALL_COLS || CCOLUMN; IF CURSOR_COLUMNS%FOUND THEN V_ALL_COLS := V_ALL_COLS || ', '; ELSE EXIT; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(V_ALL_COLS); END LOOP; CLOSE CURSOR_TABLE; END;
И я получаю результат только как anonymous block completed
.
Комментарии:
1. вывод выводится в конце/завершении программы, так это работает. Вы не можете смыть для отображения во время работы. Загляните в таблицы журналов (автономная транзакция), чтобы узнать, что происходит во время работы программы
2. Почему бы не использовать встроенный отладчик и не пройти через свой блок. Он показывает состояние всех переменных.
3. УСТАНОВИТЕ SERVEROUTPUT НА; —добавьте точку с запятой, выберите ВСЕ и запустите в разработчике, для меня все работает нормально,
Ответ №1:
Вам нужно включить dbms_output. В Oracle SQL Developer:
- Показать окно вывода СУБД (Вид-gt;Вывод СУБД).
- Нажмите кнопку » » в верхней части окна вывода СУБД, а затем выберите открытое подключение к базе данных в открывшемся диалоговом окне.
В SQL*Плюс:
SET SERVEROUTPUT ON
Комментарии:
1. В версии 1.5.5 у меня, похоже, нет этой опции в поле зрения. Там Есть Связи, Файлы, Отчеты… Строка состояния, Панели инструментов, Обновление, но без вывода СУБД. Много чего в разделе «Настройки», но я все еще не вижу возможности для вывода.
2. @ruffin: v1.5.5 3 года. Я использую v3.0, и текущая версия, похоже, v3.1.
3. /кивает, что мы застряли на 1.5.5-если бы у вас был под рукой ответ, я бы его принял, но в противном случае nps. Спасибо!
4. Я установил опцию «ВКЛЮЧИТЬ вывод СЕРВЕРА» в первой строке файла sql.
Ответ №2:
Разработчик SQL, похоже, выводит текст DBMS_OUTPUT только в том случае, если вы явно включили панель окна DBMS_OUTPUT.
Перейдите в (Меню) ВИД -gt; Dbms_output, чтобы вызвать панель.
Нажмите на зеленый знак Плюс, чтобы включить вывод для вашего подключения, а затем запустите код.
ПРАВКА: Не забудьте установить размер буфера в соответствии с ожидаемым объемом вывода.
Ответ №3:
Сделайте вывод сервера в первую очередь
SET SERVEROUTPUT on
затем- Перейдите в окно Вывода СУБД (Вид-gt;Вывод СУБД)
- затем нажмите Ctrl N для подключения сервера
Ответ №4:
Есть 2 варианта:
set serveroutput on format wrapped;
или
Откройте меню «Просмотр» и нажмите «Вывод СУБД». Вы должны получить окно вывода СУБД в нижней части рабочего листа. Затем вам нужно добавить соединение (по какой-то причине это не делается автоматически).
Ответ №5:
1 ) Перейдите в меню «Просмотр».
2 ) Выберите пункт меню DBMS_OUTPUT.
3 ) Нажмите Ctrl Nи выберите редактор соединений.
4 ) Выполните команду SET SERVEROUTPUT ПО команде.
5 ) Затем выполните свой сценарий PL/SQL.
Ответ №6:
DECLARE CTABLE USER_OBJECTS.OBJECT_NAME%TYPE; CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE; V_ALL_COLS VARCHAR2(5000); CURSOR CURSOR_TABLE IS SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OBJECT_NAME LIKE 'STG%'; CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2) IS SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = V_TABLE_NAME; BEGIN OPEN CURSOR_TABLE; LOOP FETCH CURSOR_TABLE INTO CTABLE; OPEN CURSOR_COLUMNS (CTABLE); V_ALL_COLS := NULL; LOOP FETCH CURSOR_COLUMNS INTO CCOLUMN; V_ALL_COLS := V_ALL_COLS || CCOLUMN; IF CURSOR_COLUMNS%FOUND THEN V_ALL_COLS := V_ALL_COLS || ', '; ELSE EXIT; END IF; END LOOP; close CURSOR_COLUMNS ; DBMS_OUTPUT.PUT_LINE(V_ALL_COLS); EXIT WHEN CURSOR_TABLE%NOTFOUND; END LOOP;`enter code here` CLOSE CURSOR_TABLE; END;
Я добавил Закрытие второго курсора. Он работает и тоже получает результат…
Ответ №7:
В более новых версиях разработчика SQL больше нет отдельного представления вывода, которое вам нужно отображать, вместо этого оно всегда присутствует в виде вкладки. Под вашим списком вкладок (которые разработчик SQL называет «окнами», например, две области ввода SQL) есть другой список вкладок, называемый «SQL», «Вывод» и «Статистика». Вывод не откроется автоматически, вам нужно нажать на вкладку.
Ответ №8:
выберите в меню Вид—gt;Вывод СУБД и
Ответ №9:
Перейдите в окно Вывода СУБД (Вид-gt;Вывод СУБД).