DBMS_OUTPUT.PUT_LINE non viene stampato


93

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

 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'output del server su, ottengo

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

più volte!

Risposte:


191

Cos'è "esso" nell'istruzione "dice solo che la procedura è stata completata"?

Per impostazione predefinita, la maggior parte degli strumenti non configura un buffer per dbms_outputscrivere 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, dovresti usare il comando set serveroutput on [size N|unlimited]. Quindi faresti qualcosa di simile

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

In SQL Developer, dovresti andare a View | DBMS Outputper abilitare la finestra di output DBMS, quindi premere l'icona più verde per abilitare l'output DBMS per una particolare sessione.

Inoltre, supponendo che tu non voglia stampare il letterale "a.firstNamea.lastName" per ogni riga, probabilmente vorrai

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

Spiacenti, durante l'esecuzione della procedura sopra il messaggio è la procedura PL / SQL completata con successo. Sto usando SQL plus
dexter

8
@dexter - OK. Quindi devi solo aggiungere il set serveroutput oncomando prima di eseguire la procedura in SQL * Plus.
Justin Cave

@dexter - Esatto. Vedi il mio commento alla fine: se non vuoi quel letterale per ogni riga, probabilmente vorrai la sintassi che ho pubblicato alla fine della mia risposta.
Justin Cave

Ok, quindi ora mostra i nomi corretti ma come 100 volte. come visualizzarei titolo, anno, nome del ruolo e citazione in una tabella sotto invece delle centinaia di nomi che appaiono
dexter

1
@dexter - Mi dispiace, non capisco. Stai dicendo che hai digitato l' SELECTistruzione al prompt dei comandi di SQL Plus, l'istruzione SQL eseguita, i dati sono stati restituiti, ma i dati non sono stati visualizzati in SQL Plus? Ciò sembra improbabile a meno autotraceche tu non stia giocando con le impostazioni, nel qual caso potresti aver visto un piano di query e statistiche di esecuzione piuttosto che i risultati della query. Tuttavia, stiamo iniziando ad allontanarci piuttosto dalla tua domanda originale.
Justin Cave

21
  1. Assicurati di avere la finestra di output Dbms aperta tramite 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 procedura come prima riga. Spero che questo risolva il tuo problema.

A quale applicazione sono destinate queste istruzioni?
osullic l'

14

questa dichiarazione

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

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

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

13

Impostare la query come di seguito nella prima riga

SET SERVEROUTPUT ON 

anche se non funziona .. Si prega di fornire qualsiasi altra alternativa
Lova Chittumuri

Solo per essere più chiari. La riga che Sreenath S ha suggerito va per prima ed è al di fuori di tutti i blocchi di codice come DECLARE e BEGIN / END. Ho provato a farlo prima nel mio blocco DECLARE che non funziona. Sto usando SQL * Plus.
Grant Johnson,

2

Sto usando Oracle SQL Developer,

In questo strumento, ho dovuto abilitare l'output DBMS per visualizzare i risultati stampati da dbms_output.put_line

È possibile trovare questa opzione nel riquadro dei risultati in cui vengono visualizzati altri risultati della query. quindi, nel riquadro dei risultati, ho 7 schede. La prima scheda denominata Risultati, la successiva è Output script e così via. Fuori da questo puoi trovare una scheda chiamata "Uscita DBMS" seleziona questa scheda, quindi la prima icona (sembra un'icona di dialogo) è Abilita output DBMS . Fare clic su questa icona. Quindi esegui PL / SQL, quindi seleziona "Scheda DBMS Output, dovresti essere in grado di vedere i risultati lì.


0

Tutti si stanno concentrando sul ciclo for, ma se usiamo un ciclo normale, abbiamo dovuto usare la variabile record del cursore. Quello che segue è 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;
    / 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.