Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 11g - Ausführen von PL/SQL-Cursorn

Es gibt ein paar Probleme:

  • Sie benötigen ein Semikolon nach der Cursordefinition (d.h. nach der Abfrage).
  • Sie können bookCursor nicht verwenden sowohl als Name des Cursors als auch als Name des abgerufenen Datensatzes. (Mir ist aufgefallen, dass ein Teil Ihres Codes bookCursorRec verwendet für letzteres, also bleibe ich dabei.)
  • Der fetch muss in abrufen etwas, das heißt, in bookCursorRec .
  • Sie benötigen ein Semikolon nach dem Aufruf von dbms_output.put_line .
  • Ihre Anfrage scheint falsch zu sein; es sieht so aus, als wären beide Joins Cross-Joins.

Es zusammensetzen und die Formatierung und Struktur ein wenig anpassen, damit es etwas "idiomatischer" ist PL/SQL:

DECLARE
    CURSOR bookcursor IS
    SELECT btname, isbn, pubname, datedestroyed
      FROM booktitle bt
      JOIN publisher p
        ON bt.pid = p.id -- this is just a guess
      JOIN bookcopy bc
        ON bt.bcid = bc.id -- this is just a guess
     WHERE datedestroyed IS NULL
    ;
    bookcursorrec bookcursor%ROWTYPE;
BEGIN
    OPEN bookcursor;
    LOOP
        FETCH bookcursor INTO bookcursorrec;
        EXIT WHEN bookcursor%NOTFOUND;
        dbms_output.put_line( 'ISBN: ' ||bookcursorrec.isbn
                              || ' - Book Name: ' || bookcursorrec.btname
                              || ' - Publisher: ' || bookcursorrec.pubname );
    END LOOP;
    CLOSE bookcursor;
END;
/

Übrigens wird bei Oracle-Bezeichnern meistens zwischen Groß- und Kleinschreibung unterschieden (da sie implizit in Großbuchstaben umgewandelt werden, es sei denn, Sie setzen sie in doppelte Anführungszeichen), sodass normalerweise Bezeichner wie book_cursor_rec verwendet werden und date_destroyed statt bookCursorRec (=bookcursorrec ) und dateDestroyed (=datedestroyed ).