5 Stimmen

Rückgabe einer Ergebnismenge aus einer gespeicherten Java-Prozedur über SQL "select * from "

Kann ich das Ergebnis einer gespeicherten Java-Prozedur (Oracle) direkt über eine SQL select * from Aussage ?

Auf der Datenbank würde ich eine Java gespeicherte Prozedur / Funktion haben, die, wenn sie aufgerufen wird, eine mehrspaltige, mehrzeilige Ergebnismenge zurückgibt.
Ich möchte auf diese Ergebnisse direkt über eine select * from [table] Erklärung.

Die Java Stored Procedure sollte sich also wie eine Tabelle verhalten.
In MySQL sollte das Folgende möglich sein (aber nicht in Java Stored Procedures): SELECT col1 FROM (EXEC proc1)

Ist dies in Oracle möglich, wo proc1 eine Java Stored Procedure ist?

9voto

Alessandro Rossi Punkte 2392

この回答 in einem anderen Forum könnte Ihnen helfen.

Schauen Sie sich das Beispiel unten in der Nachricht an, um zu sehen, wie man aus einer Sammlung auswählt, die von einer Java-Methode zurückgegeben wird (die auch eine Java Stored Procedure sein kann).

Hier ist ein Beispiel, wie man es mit Java Stored Procedure macht

1) Erstellen Sie ein DB-Objekt, um den Typ der zurückgegebenen Zeilen zu definieren:

create type try_obj as object (
        field_a number,
        field_b varchar2(10)
    )
/

create type try_obj_tab as table of try_obj
/

2) Erstellen Sie die Java-Klasse auf der DB mit einer statischen Methode (GetSampleResult), die eine Sammlung zurückgibt

create or replace and compile java source named QueryReturn as
import java.sql.*;
import java.util.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
import oracle.sql.*;

public class QueryReturn implements ORADataFactory,ORAData{
    private NUMBER field1;
    private CHAR field2;

    public QueryReturn(OracleConnection conn,int n,String c) throws SQLException {
        field1 = new NUMBER(n);
        field2 = new CHAR(c,oracle.sql.CharacterSet.make(conn.getStructAttrCsId()));
    }

    public QueryReturn(NUMBER n, CHAR c) {
        field1 = n;
        field2 = c;
    }
    public QueryReturn(Object[] attributes) {
        this(
                (NUMBER) attributes[0],
                (CHAR) attributes[1]
            );
    }
    public QueryReturn(Datum d) throws SQLException {
        this(((STRUCT) d).getOracleAttributes());
    }

    public ORAData create(Datum d, int sqlType) throws SQLException {
        if (d == null)
            return null;
        else {
            return new QueryReturn(d);
        }
    }

    public STRUCT toSTRUCT(Connection conn) throws SQLException  {
        StructDescriptor sd =
            StructDescriptor.createDescriptor("TRY_OBJ", conn);
        Object [] attributes = { field1,field2 };
        return new STRUCT(sd, conn, attributes);
    }
    public Datum toDatum(Connection conn) throws SQLException {
        return toSTRUCT(conn); 
    }

    public static ARRAY GetSampleResult() throws SQLException, ClassNotFoundException {
        // initialize the connection
        OracleConnection conn = null;
        conn = (OracleConnection) (new oracle.jdbc.OracleDriver()).defaultConnection();

        // create the return java array
        // There will be two Rows
        //  1   abc
        //  2   dce
        QueryReturn javaArray[] = {
                new QueryReturn(conn,1,"abc"),
                new QueryReturn(conn,2,"dce")
            };

        // Map the java class to the Oracle type
        Map map = conn.getTypeMap();
        map.put("TRY_OBJ", Class.forName("QueryReturn"));
        ArrayDescriptor jTryObjArrayDesc = ArrayDescriptor.createDescriptor (
                "TRY_OBJ_TAB",
                conn
            );

        // create an Oracle collection on client side to use as parameter
        ARRAY oracleCollection = new ARRAY(jTryObjArrayDesc,conn,javaArray);

        return oracleCollection;
    }
}

3) Erstellen Sie den Wrap, um Java Stored Procedure in einer Funktion zu verwenden

create or replace function GetSampleResult 
    return try_obj_tab
AS LANGUAGE JAVA
    NAME  'QueryReturn.GetSampleResult()  return oracle.sql.ARRAY';

4) Zeigen Sie das Ergebnis

SQL> select *
  2  from table(GetSampleResult())
  3  /

   FIELD_A FIELD_B
---------- ----------
         1 abc
         2 dce

SQL>

0voto

Adeel Ansari Punkte 38973

Schreiben Sie eine SSP (SQL Stored Procedure), um JSP (Java Stored Procedure) aufzurufen, und verwenden Sie diese SSP dann in Ihrer Abfrage. Einfach eh.

Sehen Sie sich außerdem an CallableStatement .

0voto

Wivani Punkte 2026

Ich habe es nie in Kombination mit Java verwendet, das die gespeicherte Prozedur aufruft, aber ich vermute, dass es möglich sein sollte, die "Pipelined"-Funktionalität in neueren Oracle-Datenbanken zu verwenden.

Voir aquí oder Google/Bing, um mehr darüber zu erfahren.

0voto

Petr Pribyl Punkte 3385

Ich fürchte, das ist nicht möglich. Aber wenn Ihre Datenbank die Funktionalität der Auswahl von Daten aus gespeicherten Verfahren in der von Ihnen erwähnten Weise unterstützt, können Sie eine Ansicht erstellen und daraus auswählen.

Auf jeden Fall kann Oracle ein Resultset aus einer gespeicherten Prozedur zurückgeben und Sie können von Java aus darauf zugreifen. Siehe dieser Link

-1voto

Nicholas Sushkin Punkte 11780

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X