2011-10-25 23 views
73

Volevo stampare il valore di una particolare variabile che si trova all'interno di un blocco anonimo. Sto usando Oracle SQL Developer. Ho provato a utilizzare dbms_output.put_line. Ma non sta funzionando. Il codice che sto usando è mostrato sotto.Stampa del valore di una variabile in SQL Developer

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; 

E io sono sempre l'uscita solo come anonymous block completed.

+0

l'output viene svuotato alla fine/terminazione del programma, questo è il modo in cui funziona. Non puoi eseguire il flush to display durante l'esecuzione.Cerca nelle tabelle di registro (transazione autonoma) per vedere cosa sta accadendo mentre un programma è in esecuzione – tbone

+0

Perché non utilizzare il debugger integrato e passare attraverso il blocco. Mostra lo stato di tutte le variabili. – Wolf

+2

SET SERVEROUTPUT ON; --add punto e virgola, selezionare TUTTO ed eseguire nello sviluppatore, per me funziona correttamente, –

risposta

139

È necessario attivare dbms_output. In Oracle SQL Sviluppatore:

  1. Mostra la finestra di output DBMS (Visualizza-> Uscita DBMS).
  2. Premere il pulsante "+" nella parte superiore della finestra Dbms Output e quindi selezionare una connessione al database aperta nella finestra di dialogo che si apre.

In SQL * Plus:

SET SERVEROUTPUT ON 
+0

Nella versione 1.5.5, non mi sembra di avere questa opzione sotto Visualizza. Ci sono connessioni, file, report ... Barra di stato, barre degli strumenti, aggiornamento, ma nessun output DBMS. Un sacco di cose sotto preferenze, ma non vedo ancora un'opzione per l'output. – ruffin

+0

@ruffin: v 1.5.5 ha 3 anni. Sto usando v3.0, e la versione attuale sembra essere v3.1. –

+0

/nods Siamo bloccati su 1.5.5 - se avessi la risposta a portata di mano, la prenderei, ma altrimenti np. Grazie! – ruffin

15

SQL Developer sembra uscita solo il testo DBMS_OUTPUT quando hai esplicitamente acceso il vetro della finestra DBMS_OUTPUT.

Passare a (Menu) VIEW -> Dbms_output per richiamare il riquadro.

Fare clic sul segno Green Plus per abilitare l'output per la connessione e quindi eseguire il codice.

MODIFICA: non dimenticare di impostare la dimensione del buffer in base alla quantità di output prevista.

0

selezionare Visualizza -> DBMS uscita nel menu e

0

Vai alla finestra Output DBMS (Visualizza-> DBMS Output).

3

c'è un'altra opzione:

set serveroutput on format wraped; 

o

Aprire il menu 'Visualizza' e cliccare su 'uscita DBMS'. Dovresti ottenere una finestra di output dbms nella parte inferiore del foglio di lavoro. È quindi necessario aggiungere la connessione (per qualche motivo questo non viene fatto automaticamente).

5

uscita Server Fai l'Innanzitutto

  1. SET SERVEROUTPUT on poi

  2. Vai alla finestra Output DBMS (Visualizza-> DBMS Output)

  3. quindi premere Ctrl + N per collegamento server

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; 

Ho aggiunto Chiudi del secondo cursore. Funziona e ottiene anche l'output ...

Problemi correlati