DBMS_OUTPUT.PUT_LINE wird nicht gedruckt

92

Wenn Sie den folgenden Code ausführen, wird lediglich angezeigt, dass die Prozedur abgeschlossen ist, und es werden nicht die gewünschten Informationen (Vorname, Nachname) und dann die anderen Werte aus der Auswahlabfrage in einer der folgenden Tabellen gedruckt.

 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;
/ 

Beim Einstellen der Serverausgabe bekomme ich

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

mehrmals!

Dexter
quelle

Antworten:

190

Was ist "es" in der Aussage "es sagt nur, dass der Vorgang abgeschlossen ist"?

Standardmäßig konfigurieren die meisten Tools keinen Puffer dbms_outputzum Schreiben und versuchen nicht, aus diesem Puffer zu lesen, nachdem der Code ausgeführt wurde. Die meisten Tools hingegen können dies tun. In SQL * Plus müssen Sie den Befehl verwenden set serveroutput on [size N|unlimited]. Also würdest du so etwas machen

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

In SQL Developer View | DBMS Outputaktivieren Sie das Fenster "DBMS-Ausgabe" und drücken dann auf das grüne Pluszeichen, um die DBMS-Ausgabe für eine bestimmte Sitzung zu aktivieren.

Angenommen, Sie möchten nicht das Literal "a.firstNamea.lastName" für jede Zeile drucken, möchten Sie wahrscheinlich

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Justin Cave
quelle
Entschuldigung, wenn die obige Prozedur ausgeführt wird, ist die Meldung, dass die PL / SQL-Prozedur erfolgreich abgeschlossen wurde. Ich benutze SQL Plus
Dexter
7
@dexter - OK. Dann müssen Sie nur noch den set serveroutput onBefehl hinzufügen, bevor Sie die Prozedur in SQL * Plus ausführen.
Justin Cave
@dexter - Richtig. Siehe meinen Kommentar am Ende - wenn Sie dieses Literal nicht für jede Zeile möchten, möchten Sie wahrscheinlich die Syntax, die ich am Ende meiner Antwort gepostet habe.
Justin Cave
Ok, jetzt werden die richtigen Namen angezeigt, aber wie 100-mal. Wie würde ich Titel, Jahr, Rollennamen, Zitat in einer Tabelle unten anstelle der 100er Namen anzeigen, die erscheinen
Dexter
@dexter - Wenn Sie angeben, dass jeder Name hunderte Male wiederholt wird und dies nicht Ihren Erwartungen entspricht, bedeutet dies, dass Ihre SELECTAnweisung falsch ist und wahrscheinlich eine Verknüpfungsbedingung fehlt. Sie möchten Ihre Abfrage verfeinern (die Sie ohne die Prozedur separat ausführen können), bis die Abfrage die erwarteten Daten zurückgibt.
Justin Cave
21
  1. Stellen Sie sicher, dass Ihr Dbms-Ausgabefenster über die Ansichtsoption in der Menüleiste geöffnet ist.
  2. Klicken Sie auf das grüne Pluszeichen und fügen Sie Ihren Datenbanknamen hinzu.
  3. Schreiben Sie 'DBMS_OUTPUT.ENABLE;' innerhalb Ihres Verfahrens als erste Zeile. Hoffe das löst dein Problem.
Atul Patel
quelle
14

diese Aussage

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

bedeutet, die Zeichenfolge so zu drucken, wie sie ist. Entfernen Sie die Anführungszeichen , um die zu druckenden Werte zu erhalten. Die korrekte Syntax lautet also

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
Asura
quelle
11

Stellen Sie die Abfrage in der ersten Zeile wie folgt ein

SET SERVEROUTPUT ON 
Sreenath S.
quelle
Auch wenn es nicht funktioniert. Bitte geben Sie eine andere Alternative an
Lova Chittumuri
1

Ich verwende Oracle SQL Developer.

In diesem Tool musste ich die DBMS-Ausgabe aktivieren , um die von dbms_output.put_line gedruckten Ergebnisse anzuzeigen

Sie finden diese Option im Ergebnisbereich, in dem andere Abfrageergebnisse angezeigt werden. Im Ergebnisbereich habe ich also 7 Registerkarten. Die erste Registerkarte heißt Ergebnisse, die nächste ist die Skriptausgabe und so weiter. Daraus finden Sie eine Registerkarte mit dem Namen "DBMS-Ausgabe". Wählen Sie diese Registerkarte aus. Das erste Symbol (sieht aus wie ein Dialogsymbol) lautet " DBMS-Ausgabe aktivieren" . Klicken Sie auf dieses Symbol. Anschließend führen Sie PL / SQL aus und wählen die Registerkarte "DBMS-Ausgabe". Dort sollten die Ergebnisse angezeigt werden.

John Prawyn
quelle
0

Alle konzentrieren sich auf die for-Schleife, aber wenn wir eine normale Schleife verwenden, mussten wir die Cursor-Datensatzvariable verwenden. Das Folgende ist der geänderte Code

 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;
    / 
Smart003
quelle