Печать значения переменной в SQL Developer


102

Я хотел напечатать значение конкретной переменной, которая находится внутри анонимного блока. Я использую 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.


вывод сбрасывается в конце / завершении программы, так это работает. Вы не можете смыть дисплей во время бега. Изучите таблицы журналов (автономная транзакция), чтобы узнать, что происходит во время работы программы
tbone

Почему бы не использовать встроенный отладчик и не пройти через свой блок. Он показывает состояние всех переменных.
Wolf

5
УСТАНОВИТЬ ВЫПУСК СЕРВЕРА; - добавьте точку с запятой, выберите ВСЕ и запустите в разработчике, для меня все работает нормально,
Praveenkumar_V

Ответы:


203

Вам нужно включить dbms_output. В Oracle SQL Developer:

  1. Показать окно вывода СУБД (Вид-> Вывод СУБД).
  2. Нажмите кнопку «+» в верхней части окна вывода Dbms, а затем выберите открытое соединение с базой данных в открывшемся диалоговом окне.

В SQL * Plus:

 SET SERVEROUTPUT ON

В версии 1.5.5 у меня, похоже, нет этой опции в разделе «Просмотр». Есть соединения, файлы, отчеты ... Строка состояния, панели инструментов, Обновить, но нет вывода СУБД. В настройках много всего, но я все еще не вижу возможности вывода.
ruffin

1
@ruffin: версии 1.5.5 исполнилось 3 года. Я использую v3.0, а текущая версия кажется v3.1.
Клас Линдбек

/ nods Мы застряли на 1.5.5 - если бы у вас был ответ под рукой, я бы взял его, но в противном случае nps. Спасибо!
ершин

Я установил параметр «SET SERVEROUTPUT ON» в первой строке файла sql.
Самих А

Спасибо вам большое!
Amazigh.Ca

18

Кажется, что SQL Developer выводит текст DBMS_OUTPUT только тогда, когда вы явно включили оконную панель DBMS_OUTPUT.

Перейдите в (Меню) ВИД -> Dbms_output, чтобы вызвать панель.

Щелкните значок «Зеленый плюс», чтобы включить вывод для вашего соединения, а затем запустите код.

РЕДАКТИРОВАТЬ: не забудьте установить размер буфера в соответствии с ожидаемым объемом вывода.


6

Сделайте вывод на сервер в первую очередь

  1. SET SERVEROUTPUT on затем

  2. Перейдите в окно вывода СУБД (Вид-> Вывод СУБД)

  3. затем нажмите Ctrl+ Nдля подключения к серверу


3

Есть 2 варианта:

set serveroutput on format wrapped;

или

Откройте меню «Просмотр» и нажмите «Вывод dbms». У вас должно появиться окно вывода dbms в нижней части рабочего листа. Затем вам нужно добавить соединение (по какой-то причине это не делается автоматически).


1

1) Перейдите в меню просмотра.
2) Выберите пункт меню DBMS_OUTPUT.
3) Нажмите Ctrl+ Nи выберите редактор соединений.
4) Выполните команду SET SERVEROUTPUT ON.
5) Затем выполните сценарий PL / SQL.

введите описание изображения здесь введите описание изображения здесь


0
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;

Я добавил закрытие второго курсора. Он работает и тоже выводит ...



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.