Drukowanie wartości zmiennej w SQL Developer


102

Chciałem wydrukować wartość określonej zmiennej, która znajduje się w anonimowym bloku. Używam Oracle SQL Developer. Próbowałem użyć dbms_output.put_line. Ale to nie działa. Kod, którego używam jest pokazany poniżej.

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;

I otrzymuję dane wyjściowe tylko jako anonymous block completed.


wyjście jest opróżniane na końcu / zakończeniu programu, tak to działa. Nie możesz spłukać, aby wyświetlić podczas pracy. Zajrzyj do tabel dziennika (transakcje autonomiczne), aby zobaczyć, co się dzieje podczas działania programu
tbone

Dlaczego nie skorzystać z wbudowanego debuggera i przejść przez blok. Pokazuje stan wszystkich zmiennych.
Wolf,

5
SET SERVEROUTPUT ON; - dodaj średnik, wybierz WSZYSTKIE i uruchom programistę, dla mnie działa dobrze,
Praveenkumar_V

Odpowiedzi:


203

Musisz włączyć dbms_output. W Oracle SQL Developer:

  1. Pokaż okno Wyjście DBMS (Widok-> Wyjście DBMS).
  2. Naciśnij przycisk „+” u góry okna Dbms Output, a następnie w otwartym oknie dialogowym wybierz otwarte połączenie z bazą danych.

W SQL * Plus:

 SET SERVEROUTPUT ON

Wydaje się, że w wersji 1.5.5 nie ma tej opcji w widoku. Są połączenia, pliki, raporty ... Pasek stanu, paski narzędzi, odświeżanie, ale brak danych wyjściowych DBMS. Wiele rzeczy w preferencjach, ale nadal nie widzę opcji wyjścia.
ruffin

1
@ruffin: v1.5.5 ma 3 lata. Używam wersji 3.0, a aktualna wersja wydaje się być wersją 3.1.
Klas Lindbäck

/ nods Utknęliśmy na 1.5.5 - gdybyś miał pod ręką odpowiedź, wziąłbym ją, ale nps w przeciwnym razie. Dzięki!
ruffin

Ustawiłem opcję "SET SERVEROUTPUT ON" w pierwszym wierszu pliku sql.
Samih A

Dziękuję bardzo!
Amazigh.Ca

18

SQL Developer wydaje się wyświetlać tekst DBMS_OUTPUT tylko wtedy, gdy jawnie włączyłeś panel okna DBMS_OUTPUT.

Przejdź do (Menu) VIEW -> Dbms_output, aby wywołać panel.

Kliknij znak Green Plus, aby włączyć wyjście dla połączenia, a następnie uruchom kod.

EDYCJA: Nie zapomnij ustawić rozmiaru bufora zgodnie z oczekiwaną ilością danych wyjściowych.


6

Najpierw włącz serwer wyjściowy

  1. SET SERVEROUTPUT on następnie

  2. Przejdź do okna Wyjście DBMS (Widok-> Wyjście DBMS)

  3. następnie naciśnij Ctrl+, Naby połączyć się z serwerem


3

Istnieją 2 opcje:

set serveroutput on format wrapped;

lub

Otwórz menu „Widok” i kliknij „Wyjście dbms”. Na dole arkusza powinno pojawić się okno danych wyjściowych dbms. Następnie musisz dodać połączenie (z jakiegoś powodu nie dzieje się to automatycznie).


1

1) Przejdź do menu widoku.
2) Wybierz pozycję menu DBMS_OUTPUT.
3) Naciśnij Ctrl+ Ni wybierz edytor połączeń.
4) Wykonaj polecenie SET SERVEROUTPUT ON.
5) Następnie wykonaj swój skrypt PL / SQL.

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj


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;

Dodałem zamknięcie drugiego kursora. Działa i również uzyskuje wyniki ...



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.