java 存储过程返回结果集_通过SQL“select * from”从java存储过程返回结果集

我可以直接通过SQL select * from语句从java存储过程(oracle)获取结果吗?

在数据库上,我将有一个java存储过程/函数,当它被调用时返回一个多列,多行结果集.

我想直接通过select * from [table]语句访问这些​​结果.

所以java存储过程应该像表一样.

在MySQL中,以下应该是可能的(但不是java存储过程):SELECT col1 FROM(EXEC proc1)

这可能在oracle中proc1是一个java存储过程吗?

解决方法:

This answer在不同的论坛可以帮到你.

查看消息底部的示例,了解如何从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>

标签:java,sql,stored-procedures,oracle

来源: https://codeday.me/bug/20190621/1255122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用JDBC连接数据库,执行SQL语句并将结果转换为Map的形式,示例代码如下: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; public class SqlToMapExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) { // 执行第一个 SQL 查询 ResultSet rs1 = stmt.executeQuery("SELECT column_name FROM information_schema.columns WHERE table_name = 'database_info'"); // 将查询结果转换为 Map Map<Integer, String> result1 = resultSetToMap(rs1); // 执行第二个 SQL 查询 ResultSet rs2 = stmt.executeQuery("SELECT * FROM database_info"); // 将查询结果转换为 Map Map<Integer, Map<String, Object>> result2 = resultSetToMap(rs2); // 输出结果 System.out.println("Result 1: " + result1); System.out.println("Result 2: " + result2); } catch (SQLException e) { e.printStackTrace(); } } /** * 将查询结果 ResultSet 转换为 Map 的形式 */ private static <T> Map<Integer, T> resultSetToMap(ResultSet rs) throws SQLException { Map<Integer, T> result = new HashMap<>(); int row = 0; while (rs.next()) { T rowResult = (T) rs.getObject(1); result.put(row++, rowResult); } return result; } /** * 将查询结果 ResultSet 转换为 Map 的形式 */ private static Map<Integer, Map<String, Object>> resultSetToMap(ResultSet rs) throws SQLException { Map<Integer, Map<String, Object>> result = new HashMap<>(); int row = 0; while (rs.next()) { Map<String, Object> rowResult = new HashMap<>(); for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { rowResult.put(rs.getMetaData().getColumnLabel(i), rs.getObject(i)); } result.put(row++, rowResult); } return result; } } ``` 在代码中,我们使用 `DriverManager.getConnection()` 方法连接数据库,然后使用 `Statement` 对象执行 SQL 查询语句。我们定义了两个查询语句,分别是查询 `database_info` 表中的所有列名和查询 `database_info` 表中的所有数据。 在 `resultSetToMap()` 方法中,我们将查询结果转换为 Map 的形式。第一个参数是查询结果的 `ResultSet` 对象,第二个参数是 Map 的 value 类型。我们首先定义一个空的 Map 对象 `result` ,然后遍历查询结果,将每一行转换为 Map 的形式,并将其加入 `result` 中。其中,第一个 `resultSetToMap()` 方法用于将查询结果转换为 Map<Integer, String> 的形式,第二个 `resultSetToMap()` 方法用于将查询结果转换为 Map<Integer, Map<String, Object>> 的形式。 最后,我们在主函数中分别执行两个查询语句,将结果存储在不同的 Map 中,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值