2012-05-03 15 views
51

Quando si esegue il seguente codice, si dice semplicemente che la procedura è completata e non stampa le informazioni che voglio (firstName, lastName) e quindi gli altri valori dalla query select in una tabella sottostante .DBMS_OUTPUT.PUT_LINE non stampa

CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char) 
AS 
CURSOR quote_recs IS 
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r, 
rolequote rq, actor a, movie m 
where 
rq.quoteID = q.quoteID 
AND 
rq.roleID = r.roleID 
AND 
r.actorID = a.actorID 
AND 
r.movieID = m.movieID 
AND 
a.actorID = id_actor; 
BEGIN 
FOR row IN quote_recs LOOP 
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName'); 

end loop; 
END PRINT_ACTOR_QUOTES; 
/

Quando si imposta l'uscita server, ottengo

a.firstNamea.lastName 
a.firstNamea.lastName 
a.firstNamea.lastName 
a.firstNamea.lastName 

più volte!

risposta

115

Cosa significa "it" nell'istruzione "dice solo che la procedura è stata completata"?

Per impostazione predefinita, la maggior parte degli strumenti non configura un buffer per dbms_output in cui scrivere e non tenta di leggere da quel buffer dopo l'esecuzione del codice. La maggior parte degli strumenti, d'altra parte, ha la capacità di farlo. In SQL * Plus, è necessario utilizzare il comando set serveroutput on [size N|unlimited]. Così si farebbe qualcosa di simile

SQL> set serveroutput on size 30000; 
SQL> exec print_actor_quotes(<<some value>>); 

In SQL Developer, devi andare a View | DBMS Output per attivare la finestra Output DBMS, quindi spingere il più icona verde per consentire DBMS uscita per una particolare sessione.

Inoltre, partendo dal presupposto che non si desidera stampare il "a.firstNamea.lastName" letterale per ogni riga, probabilmente si desidera

FOR row IN quote_recs 
LOOP 
    DBMS_OUTPUT.PUT_LINE(row.firstName || ' ' || row.lastName); 
END LOOP; 
+0

Siamo spiacenti, quando si esegue la procedura sopra il messaggio la procedura PL/SQL è stata completata correttamente. Sto usando SQL plus – dexter

+6

@dexter - OK. Quindi è sufficiente aggiungere il comando 'set serveroutput on' prima di eseguire la procedura in SQL * Plus. –

+0

vedere la mia modifica – dexter

12

questa dichiarazione

DBMS_OUTPUT.PUT_LINE ('a.firstName' || 'a.lastName');

significa stampare la stringa così com'è .. rimuovere le virgolette per ottenere i valori da printed.So la sintassi corretta è

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName); 
0

Tutti loro stanno concentrando sul ciclo for ma se usiamo un ciclo normale allora dovevamo usare la variabile di registrazione del cursore. Il seguente è il codice modificato

CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char) 
    AS 
    CURSOR quote_recs IS 
    SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r, 
    rolequote rq, actor a, movie m 
    where 
    rq.quoteID = q.quoteID 
    AND 
    rq.roleID = r.roleID 
    AND 
    r.actorID = a.actorID 
    AND 
    r.movieID = m.movieID 
    AND 
    a.actorID = id_actor; 
    recd quote_recs%rowtype; 
    BEGIN 
    open quote_recs; 
    LOOP 
    fetch quote_recs into recs; 
    exit when quote_recs%notfound; 
    DBMS_OUTPUT.PUT_LINE(recd.firstName||recd.lastName); 
    end loop; 
    close quote_recs; 
    END PRINT_ACTOR_QUOTES; 
    /
10
  1. Assicurarsi di avere la finestra di uscita DBMS aperta attraverso l'opzione di visualizzazione nella barra dei menu.
  2. Fare clic sul segno "+" verde e aggiungere il nome del database.
  3. Scrivi "DBMS_OUTPUT.ENABLE;" all'interno della tua procedura come prima riga. Spero che questo risolva il tuo problema.
+0

Non ho dovuto fare il passaggio 3. Grazie anche a @Atul e @Usman! –