sql >> Base de Datos >  >> RDS >> Oracle

Oracle 11g - Ejecución de cursores PL/SQL

Hay algunos problemas:

  • Necesita un punto y coma después de la definición del cursor (es decir, después de la consulta).
  • No puedes usar bookCursor tanto como el nombre del cursor como el nombre del registro que busca. (Noté que una parte de su código usa bookCursorRec para lo último, así que me quedo con eso).
  • El fetch necesita buscar en algo, es decir, en bookCursorRec .
  • Necesita un punto y coma después de la llamada a dbms_output.put_line .
  • Su consulta parece incorrecta; parece que ambas uniones son uniones cruzadas.

Juntándolo y ajustando un poco el formato y la estructura para que sea un poco más "idiomático" 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;
/

Por cierto, los identificadores de Oracle en su mayoría distinguen entre mayúsculas y minúsculas (en el sentido de que se convierten implícitamente a mayúsculas a menos que los envuelva entre comillas dobles), por lo que generalmente las personas usarán identificadores como book_cursor_rec y date_destroyed en lugar de bookCursorRec (=bookcursorrec ) y dateDestroyed (=dateDestroyed ).