Печать значения переменной в 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.