簡體   English   中英

通過SQL“select * from”從java存儲過程返回結果集

[英]returning a result set from a java stored procedure through SQL “select * from ”

我可以直接通過SQL select * from語句從java存儲過程(oracle)獲取結果嗎?

在數據庫上,我將有一個java存儲過程/函數,當它被調用時返回一個多列,多行結果集。
我想直接通過select * from [table]語句訪問這些​​結果。

所以java存儲過程應該像表一樣。
在MySQL中,以下應該是可能的(但不是java存儲過程): SELECT col1 FROM (EXEC proc1)

這可能在oracle中proc1是一個java存儲過程嗎?

在不同的論壇上的這個答案可能會幫助你。

查看消息底部的示例,了解如何從Java方法返回的集合中進行選擇(也可能是Java存儲過程)。

以下是有關如何使用Java存儲過程執行此操作的示例

1)創建DB對象以定義返回行的類型:

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

create type try_obj_tab as table of try_obj
/

2)使用返回Collection的靜態方法(GetSampleResult)在DB上創建Java類

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>

編寫SSP(SQL存儲過程)以調用JSP(Java存儲過程),然后在查詢中使用該SSP。 簡單呃。

進一步,看看CallableStatement

我從來沒有將它與Java一起調用存儲過程,但我猜想應該可以在最近的Oracle數據庫中使用'pipelined'功能。

請參閱此處或Google / Bing了解詳情。

我擔心這是不可能的。 但是,如果您的數據庫支持以您提到的方式從存儲過程中選擇數據的功能,則可以創建視圖並從中進行選擇。

無論如何,Oracle可以從存儲過程返回結果集,您可以從Java訪問它。 看到這個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM