возвращая набор результатов из хранимой процедуры Java через SQL "select * from" - PullRequest
4 голосов
/ 21 апреля 2011

Могу ли я получить результат из хранимой процедуры Java (оракул) напрямую через оператор SQL select * from?

В базе данных у меня будет хранимая процедура / функция Java, которая при вызове возвращает многостолбцовый, многострочный набор результатов. Я хотел бы получить доступ к этим результатам напрямую через оператор select * from [table].

Таким образом, хранимая процедура Java должна вести себя как таблица.
В MySQL должно быть возможно следующее (но не хранимые процедуры Java): SELECT col1 FROM (EXEC proc1)

Возможно ли это в Oracle, где proc1 - хранимая процедура Java?

Ответы [ 5 ]

5 голосов
/ 05 июля 2011

Этот ответ на другом форуме может вам помочь.

Посмотрите на образец внизу сообщения, чтобы увидеть, как выбрать из коллекции, возвращенной методом Java (это также может быть хранимая процедура Java).

Вот пример того, как сделать это с помощью хранимой процедуры Java

1) Создайте объект БД для определения типа возвращаемых строк:

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

create type try_obj_tab as table of try_obj
/

2) Создайте класс Java в БД с помощью статического метода (GetSampleResult), который возвращает коллекцию

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) Создайте Wrap для использования хранимой процедуры Java в функции

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

4) Показать результат

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

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

SQL>
0 голосов
/ 28 февраля 2012

Боюсь, это невозможно.Но если ваша база данных поддерживает функциональность выбора данных из хранимой процедуры так, как вы упомянули, вы можете создать представление и выбрать из него.

В любом случае Oracle может вернуть набор результатов из хранимой процедуры и получить к нему доступ из Java.Смотрите эту ссылку

0 голосов
/ 21 апреля 2011

Я никогда не использовал его в сочетании с Java, вызывающим хранимую процедуру, но я предполагаю, что в последних базах данных Oracle должна быть возможность использовать «конвейерную» функциональность.

См. здесь или Google / Bing, чтобы узнать больше.

0 голосов
/ 14 июня 2011
0 голосов
/ 21 апреля 2011

Напишите SSP (хранимая процедура SQL) для вызова JSP (хранимая процедура Java), а затем используйте этот SSP в запросе. Просто эх.

Далее, посмотрите на CallableStatement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...