Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 11g - Exécution de curseurs PL/SQL

Il y a quelques problèmes :

  • Vous avez besoin d'un point-virgule après la définition du curseur (c'est-à-dire après la requête).
  • Vous ne pouvez pas utiliser bookCursor à la fois comme nom du curseur et comme nom de l'enregistrement que vous récupérez. (Je remarque qu'une partie de votre code utilise bookCursorRec pour ce dernier, donc je vais y aller.)
  • Le fetch doit aller chercher dans quelque chose, c'est-à-dire dans bookCursorRec .
  • Vous avez besoin d'un point-virgule après l'appel à dbms_output.put_line .
  • Votre requête semble erronée ; il semble que les deux jointures soient des jointures croisées.

Assembler et ajuster un peu la mise en forme et la structure pour que ce soit un peu plus "idiomatique" 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;
/

Soit dit en passant, les identifiants Oracle sont pour la plupart sensibles à la casse (en ce sens qu'ils sont implicitement convertis en majuscules à moins que vous ne les mettiez entre guillemets), donc généralement les gens utiliseront des identifiants comme book_cursor_rec et date_destroyed plutôt que bookCursorRec (=bookcursorrec ) et dateDestroyed (=datedestroyed ).