sql >> Database teknologi >  >> RDS >> Oracle

Oracle 11g - Kører PL/SQL markører

Der er et par problemer:

  • Du skal bruge et semikolon efter markørdefinitionen (dvs. efter forespørgslen).
  • Du kan ikke bruge bookCursor både som navnet på markøren og som navnet på den post, du henter. (Jeg bemærker, at en del af din kode bruger bookCursorRec for sidstnævnte, så det går jeg med.)
  • fetch skal hente ind noget, det vil sige i bookCursorRec .
  • Du skal bruge et semikolon efter opkaldet til dbms_output.put_line .
  • Din forespørgsel virker forkert; det ser ud til, at begge sammenføjninger er krydsforbindelser.

At sætte det sammen, og justere formateringen og strukturen lidt, så det er lidt mere "idiomatisk" 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;
/

I øvrigt er Oracle identifikatorer for det meste store og små bogstaver (ved at de implicit konverteres til store bogstaver, medmindre du pakker dem ind i dobbelte anførselstegn), så normalt vil folk bruge identifikatorer som book_cursor_rec og date_destroyed i stedet for bookCursorRec (=bookcursorrec ) og dateDestroyed (=datedestroyed ).



  1. timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP kan være null på én maskine, men ikke en anden?

  2. PHP:ekko antallet af dubletter i en tabel efter de mest almindelige

  3. Hvorfor får jeg en ORA-01722 (ugyldigt nummer)?

  4. CEILING() Eksempler i SQL Server