执行匿名pl / sql块并在java中获取结果集

我想执行匿名PL / SQL并需要获取结果集对象。 我得到的代码可以通过在PL / SQL块中使用游标来完成。

但PL / SQL块本身将作为文本来自数据库。 所以我无法编辑那个PL / SQL块。 并且它将仅返回两个值,其列名将始终相同。 它将返回2列组合值的列表。

这里我给出了PL / SQL示例。

BEGIN RETURN 'select distinct fundname d, fundname r from  where condition order by 1'; EXCEPTION WHEN OTHERS THEN RETURN 'SELECT ''Not Available'' d, ''Not Available'' r FROM dual'; END;

任何回复都会非常有帮助。

这是一个如何“执行匿名PL / SQL并获取结果集对象”的自包含示例

 import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Types; import oracle.jdbc.OracleTypes; public class CallPLSQLBlockWithOneInputStringAndOneOutputStringParameterAndOneOutputCursorParameter { public static void main(String[] args) throws Exception { DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); // Warning: this is a simple example program : In a long running application, // error handlers MUST clean up connections statements and result sets. final Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "manager"); String plsql = "" + " declare " + " p_id varchar2(20) := null; " + " l_rc sys_refcursor;" + " begin " + " p_id := ?; " + " ? := 'input parameter was = ' || p_id;" + " open l_rc for " + " select 1 id, 'hello' name from dual " + " union " + " select 2, 'peter' from dual; " + " ? := l_rc;" + " end;"; CallableStatement cs = c.prepareCall(plsql); cs.setString(1, "12345"); cs.registerOutParameter(2, Types.VARCHAR); cs.registerOutParameter(3, OracleTypes.CURSOR); cs.execute(); System.out.println("Result = " + cs.getObject(2)); ResultSet cursorResultSet = (ResultSet) cs.getObject(3); while (cursorResultSet.next ()) { System.out.println (cursorResultSet.getInt(1) + " " + cursorResultSet.getString(2)); } cs.close(); c.close(); } } 

上面的示例查询“select one id,’hello’名称来自双联合选择2,’peter’来自dual;” 可以被任何查询替换。

首先,您发布的代码无效。 匿名PL / SQL块无法返回表达式。 并且没有PL / SQL块可以返回类似的查询结果。 您需要执行诸如声明REF CURSOR并使用各种SQL语句打开该游标之类的操作。

由于匿名PL / SQL块无法向调用者返回任何内容,因此您所描述的体系结构存在问题。 至少,您需要修改匿名块,以便有一个JDBC代码可以注册的绑定变量。 类似的东西(改编自Menon专家Oracle JDBC编程中的一个例子(注意我可能已经引入了一些小的语法错误)

 CallableStatement stmt := null; ResultSet rset := null; String query := 'DECLARE FUNCTION get_result RETURN SYS_REFCURSOR AS l_rc SYS_REFCURSOR; BEGIN OPEN l_rc FOR SELECT DISTINCT fundname d, fundname r FROM some_table WHERE some_condition ORDER BY 1; RETURN l_rc; EXCEPTION WHEN others THEN OPEN l_rc FOR SELECT 'Not Available' d, 'Not Available' r FROM dual; RETURN l_rc; END get_result; BEGIN ? := get_result; END;'; try { cstmt := conn.prepareCall( query ); cstmt.registerOutParameter( 1, OracleTypes.CURSOR ); cstmt.execute(); rset := (ResultSet) cstmt.getObject( 1 ); } finally { <> } 

尝试这样的事情(伪代码):

 [create or replace] function get_dataset (p_query in varchar2) return sys_refcursor as l_returnvalue sys_refcursor; begin open l_returnvalue for p_query; return l_returnvalue; end get_dataset; 

返回的REF CURSOR可以像普通数据集一样处理。

当你使用这样的方法时要小心SQL注入 ……