Oracle 11g - Running PL/SQL-Cursor
Ich versuche, führen Sie diesen code auf Oracle 11g und es gibt mir die Fehlermeldung unten. Ich kann nicht scheinen, um es richtig zu machen.
DECLARE
CURSOR bookcursor IS
SELECT btName, BookCopy.Isbn, pubName, dateDestroyed
FROM booktitle bt
JOIN publisher p
ON bt.pubId = p.pubId
JOIN bookcopy bc
ON bt.Isbn = bc.Isbn
WHERE datedestroyed IS NULL
;
bookcursorrec bookcursor%ROWTYPE;
BEGIN
OPEN bookcursor;
LOOP
FETCH bookcursor INTO bookcursorrer;
EXIT WHEN bookcursor%NOTFOUND;
dbms_output.put_line( 'ISBN: ' ||bookcursorrec.isbn
|| ' - Book Name: ' || bookcursorrec.btname
|| ' - Publisher: ' || bookcursorrec.pubname );
END LOOP;
CLOSE bookcursor;
END;
ERROR at line 3:
ORA-06550: line 3, column 20:
PL/SQL: ORA-00904: "BOOKCOPY"."ISBN": invalid identifier
ORA-06550: line 3, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 2, column 12:
PLS-00341: declaration of cursor 'BOOKCURSOR' is incomplete or malformed
ORA-06550: line 11, column 19:
PL/SQL: Item ignored
ORA-06550: line 15, column 31:
PLS-00201: identifier 'BOOKCURSORRER' must be declared
ORA-06550: line 15, column 9:
PL/SQL: SQL Statement ignored
ORA-06550: line 17, column 42:
PLS-00320: the declaration of the type of this expression is incomplete or
malformed
ORA-06550: line 17, column 9:
PL/SQL: Statement ignored
Können Sie bitte zeigen Sie mir, was ist falsch? Ich kann nicht scheinen, um zu verstehen, was falsch
Dank,
Brian
InformationsquelleAutor Brian | 2012-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Probleme:
bookCursor
sowohl als der name des Cursors und wie der name von der Scheibe zu Holen. (Ich merke, dass etwas von Ihrem code verwendetbookCursorRec
für das letztere, so werde ich gehen.)fetch
abrufen muss in etwas, das ist inbookCursorRec
.dbms_output.put_line
.Setzen Sie zusammen, und anpassen der Formatierung und Struktur ein wenig, so dass es etwas mehr "idiomatischen" PL/SQL:
Durch die Art und Weise, Oracle-Bezeichner sind meist groß-und Kleinschreibung (Sie sind implizit in Großbuchstaben, es sei denn, Sie wickeln Sie Sie in doppelte Anführungszeichen), also in der Regel Menschen nutzen Bezeichner wie
book_cursor_rec
unddate_destroyed
eher alsbookCursorRec
(=bookcursorrec
) unddateDestroyed
(=datedestroyed
).Oh, Hoppla, du hast auch fehlt ein Semikolon nach Ihrem
dbms_output.put_line(...)
- Anweisung. Ich werde aktualisieren, meine Antwort mit, und ein paar andere Probleme, die ich sehe . . .O. K., ich habe aktualisiert mein Antwort.
Hi, ich update den code in meiner Haupt-Antwort mit einem neuen Fehler. Ich kann nicht scheinen, um dieses Recht zu bekommen:/
Der erste Fehler ("Spalte mehrdeutig definiert") wird, weil Sie eine
isbn
in beidenbooktitle
undbookcopy
, so dass Oracle kann nicht sagen, welches du meinst. (Technisch sind Sie gleichwertig, aufgrund der Verknüpfung, aber Oracle nicht erkennen, dass.) So müssen Sie zum ändern derisbn
in IhremSELECT
Klausel entwederbooktitle.isbn
oderbookcopy.isbn
(wie Sie bevorzugen). Ich glaube, dass der zweite Fehler ("Erklärung der cursor 'BOOKCURSOR' ist unvollständig oder fehlerhaft") ist eine Folge des ersten Fehlers: sobald Sie beheben die Abfrage, das sollte Weg gehen.InformationsquelleAutor ruakh
Müssen Sie ändern
in
oberhalb der
while
.Auch
Lesen sollte
InformationsquelleAutor René Nyffenegger
InformationsquelleAutor Aravind Rajasekaran
Auch wichtig, zu überprüfen, Benutzer wählen Sie erteilen aus, um das Objekt oder die Tabelle in Frage.
Mein Problem habe gelöst, durch die Gewährung von Benutzer select-Zugriff auf die Tabelle verwendet, in der der cursor;
InformationsquelleAutor anil