[英]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了解詳情。
Tom Kyte說:“ 你不能將java存儲過程的結果集返回給plsql。 ”
我擔心這是不可能的。 但是,如果您的數據庫支持以您提到的方式從存儲過程中選擇數據的功能,則可以創建視圖並從中進行選擇。
無論如何,Oracle可以從存儲過程返回結果集,您可以從Java訪問它。 看到這個鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.