Ganymed Geschrieben 30. Juli 2007 Teilen Geschrieben 30. Juli 2007 Hallo zusammen, ich habe hier eine Datenmenge von number-Datentypen, die ich gerne als eine Art Schnittstelle an einen JAVA-Programmierer übergeben möchte. Zu diesem Zweck habe ich eine Funktion geschrieben, die mir die gewünschten Daten in einen selbstdefinierten Typen sichert: TYPE tMeinDatentyp IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; Nun möchte ich dieses Result gerne als Returnwert zurückgeben. Leider habe ich überhaupt keine Ahnung, wonach ich suchen muss, bzw. das Codesement im Kopf der Funktion aussehen muss, um dies zu bewerkstelligen. Mit einem create or replace function MeineFunktion( vVariable in varchar )return tMeinDatentyp is bekomme ich als Meldung PLS-00498, welche besagt, dass ich einen Datentyp benutzen möchte, den ich noch nicht deklariert habe (ist ja an und für sich schon richtig ). Könntet ihr mir helfen? Ist diese TYPE-Geschichte auch der völlig falsche Ansatz? Immerhin muss der JAVA-Entwickler ja auch was mit meinem Result anfangen können. Dank und Gruß Gany Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
P3AC3MAK3R Geschrieben 30. Juli 2007 Teilen Geschrieben 30. Juli 2007 Der folgende Artikel könnte Dir weiterhelfen: http://www.enterprisedt.com/publications/oracle/result_set.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ganymed Geschrieben 30. Juli 2007 Autor Teilen Geschrieben 30. Juli 2007 Tut mir leid, aber ich versteh da nur Bahnhof... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
P3AC3MAK3R Geschrieben 30. Juli 2007 Teilen Geschrieben 30. Juli 2007 In dem Beispiel wird folgendes angelegt: - REF CURSOR ref_cursor - Tabelle STOCK_PRICES - Stored Procedure sp_get_stocks Die Stored Procedure sp_get_stocks öffnet einen Cursor, wobei die Tabelle STOCK_PRICES die Datenquelle ist. Das Abfrageergebnis wird dann in Form eines REF CURSORs zurückgegeben. Im Abschnitt "Calling the stored procedure from Java" wird dann beschrieben, wie man per Java auf den Rückgabewert zurückgreift. Wenn ich Dich richtig verstanden habe, sollte genau dieser Mechanismus das sein, was Du suchst. Ist der Ansatz ein wenig klarer geworden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ganymed Geschrieben 30. Juli 2007 Autor Teilen Geschrieben 30. Juli 2007 Irgendwie hab ich im PL/SQL Developer das gleiche in grün... Es ist nicht vorher deklariert. Gibts keine anständigen Beispiele ohne dieses Package Declare gedöns? Meine "tollen" Bücher hier bringen mich auch nicht weiter. :hells: Da steht nur drin was es ist, aber nicht, wie man es benutzt. Wie man das von JAVA abholt ist mir eigentich egal, ich hab da nichts mehr mit zu tun. Am liebsten wäre mir ne Rückgabe von Numberwerten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ganymed Geschrieben 30. Juli 2007 Autor Teilen Geschrieben 30. Juli 2007 Ich nochmal... Ich schaffe es einfach nicht, meinen eigenen Datentyp als Rückgabeparameter zu definieren. Ich hab jetzt zig Beispiele durch, keines klappt. Ich weiß nicht, wo ich das hin packen soll :confused: Ein Beispiel ist: DECLARE TYPE SalesForce IS VARRAY(25) OF Salesperson; FUNCTION top_performers (n INTEGER) RETURN SalesForce IS ... Mache ich das analog zu meinem: Declare TYPE tMeinDatentyp as TABLE OF NUMBER INDEX BY BINARY_INTEGER; create or replace function MeineFunktion ( vVariable in varchar ) RETURN tMeinDatentyp is... Bekomme ich den Fehler, dass er das nicht benutzen kann, weils nicht deklariert ist? Ich weiß wirklich nicht, wie ich das einbauen soll... Der TYPE ist in Ordnung, über den JAVA ODBC kommt man dann per Array wohl dran. Das wäre mir lieber als dieser Ref Cursor. Nachtrag: In den anderen Beispielen gab es das auch ohne Declare Befehl. Funktioniert alles nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
P3AC3MAK3R Geschrieben 30. Juli 2007 Teilen Geschrieben 30. Juli 2007 Der Kern meiner Aussage war, daß Dein eigener Typ eigentlich gar nicht benötigt wird... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ganymed Geschrieben 30. Juli 2007 Autor Teilen Geschrieben 30. Juli 2007 Nichtsdestotrotz hab ich das Problem ja bei beiden Varianten... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 3. August 2007 Teilen Geschrieben 3. August 2007 Hi, du musst ein package verwenden, da PL/SQL Collection nicht im SQL Kontext erlaubt sind. In Java OracleCallableStatement cstmt = null; long[] deineLongs = new long[maxLength]; cstmt = (OracleCallableStatement) dbUtilsConnection.prepareCall("{?=call mypkg.deineFunc(?)}"); cstmt.registerIndexTableOutParameter(1,maxLength, OracleTypes.NUMBER,0); cstmt.setString(2,"DeinString"); cstmt.execute(); deineLongs= (long[]) cstmt.getPlsqlIndexTable(1,java.lang.Long.TYPE); In PL/SQL: CREATE OR REPLACE PACKAGE MYPKG AS TYPE tMeinDatentyp IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; FUNCTION meineFunktion(vVariable IN VARCHAR2)RETURN tMeinDatentyp; END MYPKG; / CREATE OR REPLACE PACKAGE BODY MYPKG AS FUNCTION meineFunktion(vVariable IN VARCHAR2)RETURN tMeinDatentyp IS retVal tMeinDatentyp; BEGIN RETURN retVal; END; END MYPKG; / Das sollte es gewesen sein. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.