ORA-00932: inkonsistente Datentypen: erwartet - got -
Ich habe mit Oracle(10g.2) als PHP-Programmierer seit fast 3 Jahren, aber wenn ich gab eine Zuweisung, ich habe versucht, verwenden Sie den ref Cursor-und collection-Typen für die erste Zeit. Und Ich
've durchsucht das web, wenn ich mit Problemen konfrontiert, und dies ora-00932 Fehler wirklich überwältigt mich. Ich brauche Hilfe von einem alten hand.
Hier ist, was ich die Bekämpfung,
Ich möchten wählen Sie Zeilen aus einer Tabelle, und setzen Sie Sie in einen ref-cursor, und dann mit record-Typ, sammeln Sie in einem assoziativen array. Und wieder von diesem assoziativen array, machen einen ref-cursor. Frag mich nicht warum, ich bin das schreiben eines so komplizierten code, weil ich es brauche weitere komplexe Aufgabe. Ich könnte verwirrend klingen, um Sie, so lassen Sie mich Ihnen zeigen, meine codes.
Habe ich 2 Typen definiert in der Registerkarte Dateitypen in Kröte. Einer von Ihnen ist ein Objekt-Typ:
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
Andere ist eine Sammlung geben, die mit den Objekt-Typ erstellt oben:
CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
Dann habe ich ein Paket erstellen:
CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
Paket, Karosserie:
CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
rcur MYPACK_PKG.MY_REF_CURSOR;
sql_stmt VARCHAR2(1000);
l_rarray tr_type := tr_type();
l_rec r_type;
BEGIN
sql_stmt := 'SELECT 1,e.first_name,e.last_name FROM hr.employees e ';
OPEN rcur FOR sql_stmt;
LOOP
fetch rcur into l_rec;
exit when rcur%notfound;
l_rarray := tr_type( l_rec );
END LOOP;
CLOSE rcur;
--OPEN r_cursor FOR SELECT * FROM TABLE(cast(l_rarray as tr_type) );
END MY_PROC;
END MYPACK_PKG;
Kommentierte ich aus der letzten Zeile, wo ich offen ref cursor. Weil es verursacht einen Fehler, wenn ich die Prozedur ausführen, die im Toad SQL-Editor, und es ist die zweite Frage, die ich Ihnen stellen werde.
Und schließlich habe ich den code auszuführen, der in Toad:
variable r refcursor
declare
r_out MYPACK_PKG.MY_REF_CURSOR;
begin
MYPACK_PKG.MY_PROC(r_out);
:r := r_out;
end;
print :r
Dort bekomme ich die ora-00932 Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Art, wie du mit der REF-CURSOR ist ungewöhnlich. Dies wäre der normale Weg, Sie zu verwenden:
Ich bin mir nicht sicher, was Sie hier versuchen zu erreichen, Sie sind Holen Sie den ref cursor innerhalb der Prozedur und dann wieder eine andere ref-cursor, die die gleichen Daten. Ich glaube nicht, dass es notwendig ist, Holen Sie den cursor an alle in der Prozedur. Lassen Sie die aufrufende app das abrufen (hier das abrufen erfolgt durch die
print
).Update: warum werden die Leute, die nicht gerade hilfreichen Fehlermeldung?
Bist du mit einem cursor geöffnet dynamisch und ich denke, das ist Teil der Grund, dass Sie immer die sinnlose Fehlermeldungen. Wenn wir mit festen SQL die Fehlermeldung ist anders:
Habe ich dargestellt, dass derzeit in 10.2 können Sie Holen einen cursor in eine PLSQL-Datensatz, aber die nicht in ein SQL-Objekt.
Update: bezüglich der
PLS-00306
: falsche Anzahl oder Typen von Argumentenl_rarray ist eine GESCHACHTELTE TABELLE, muss es initialisiert werden und dann erweitert werden können, zum speichern von Elementen. Zum Beispiel:
Für weitere Informationen können Sie der Dokumentation für PL/SQL-collections und Datensätze.
DECLARE lc SYS_REFCURSOR; ldummy VARCHAR2(1); BEGIN OPEN lc FOR 'SELECT * FROM DUAL'; FETCH lc INTO ldummy; CLOSE lc;END;