sql >> Databáze >  >> RDS >> Oracle

Oracle 11g - Spouštění PL/SQL kurzorů

Existuje několik problémů:

  • Za definicí kurzoru (tj. za dotazem) potřebujete středník.
  • Nemůžete použít bookCursor jako název kurzoru i jako název načteného záznamu. (Všiml jsem si, že část vašeho kódu používá bookCursorRec pro to druhé, takže s tím půjdu.)
  • fetch potřebuje načíst do něco, tedy do bookCursorRec .
  • Za voláním dbms_output.put_line potřebujete středník .
  • Váš dotaz se zdá být nesprávný; vypadá to, že obě spojení jsou křížová.

Dát to dohromady a trochu upravit formátování a strukturu, aby to bylo trochu "idiomatičtější" 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;
/

Mimochodem, identifikátory Oracle většinou rozlišují velká a malá písmena (v tom, že jsou implicitně převedeny na velká písmena, pokud je nezabalíte do dvojitých uvozovek), takže lidé obvykle budou používat identifikátory jako book_cursor_rec a date_destroyed spíše než bookCursorRec (=bookcursorrec ) a dateDestroyed (=datedestroyed ).



  1. SQL:Vyberte 3 nejlepší záznamy + součet množství

  2. SQLSTATE[HY000]:Obecná chyba:3780 Odkazující sloupec 'user_id' a odkazovaný sloupec 'id' v cizím klíči nejsou kompatibilní

  3. Operátor mínus mi dává chyby v mysql

  4. Nelze se připojit k místnímu serveru MySQL přes soket '/var/lib/mysql/mysql.sock' (2)