java:
CallableStatement cpstm=
conn.prepareCall("{ ?=call testpackage.selectdata(?) }");
cpstm.registerOutParameter(1,OracleTypes.CURSOR); cpstm.setString(2,"000001");
cpstm.execute();
ResultSet rst=(ResultSet)cpstm.getObject(1);
pl/sql:CREATE OR REPLACE PACKAGE "EMS"."TESTPACKAGE" as
Type myrctype is ref cursor return aal2gwyatmendpoint%rowtype;
function selectdata(val varchar2) return myrctype;
end testpackage;CREATE OR REPLACE PACKAGE BODY "EMS"."TESTPACKAGE" as
function selectdata(val varchar2) return myrctype is rc myrctype;
begin
open rc for select * from aal2gwyatmendpoint where substr(endpointindex,length(endpointindex)-5)=val;
return rc;
end;end testpackage;
这是看了弱水老大和一位高手讨论后学到的,希望能帮助你。
CallableStatement cpstm=
conn.prepareCall("{ ?=call testpackage.selectdata(?) }");
cpstm.registerOutParameter(1,OracleTypes.CURSOR); cpstm.setString(2,"000001");
cpstm.execute();
ResultSet rst=(ResultSet)cpstm.getObject(1);
pl/sql:CREATE OR REPLACE PACKAGE "EMS"."TESTPACKAGE" as
Type myrctype is ref cursor return aal2gwyatmendpoint%rowtype;
function selectdata(val varchar2) return myrctype;
end testpackage;CREATE OR REPLACE PACKAGE BODY "EMS"."TESTPACKAGE" as
function selectdata(val varchar2) return myrctype is rc myrctype;
begin
open rc for select * from aal2gwyatmendpoint where substr(endpointindex,length(endpointindex)-5)=val;
return rc;
end;end testpackage;
这是看了弱水老大和一位高手讨论后学到的,希望能帮助你。
感谢回答,但是JSP中不认识"OracleTypes.CURSOR", 用什么可以替换呢?
在基于多DB的模块开发中,你可能会遇到Oracle的sp不能像MSSQL的sp最后能返回结果集的问题,并为此急得跳脚大骂Oracle不已.
或许更倒霉的是:你在MSSQL中返回的结果集是个动态的结果集,是从不能事先确定名字的userTable或是tempTable中选取的纪录,那么移植到Oracle上更是叫人吐血.
其实用Oracle的cursor类作为sp的out参数可以解决这个问题.
由于只是作为例子,因此下面的package和sp及Java程序尽可能的简单,便于理解.
首先在SQL*Plus中建立下面的package及sp:
create or replace package pkg_test
as
type cur_test is ref cursor; -- 定义一个cursor的type
end pkg_test;
/
create or replace procedure p_test
(
tblname varchar2,
v_cur out pkg_test.cur_test
)
as
v_sql varchar2(100); -- 执行的SQL脚本
begin
v_sql := 'select * from ' || tblname;
OPEN v_cur FOR v_sql; -- 这一句最为关键,是将结果集存放在v_cur中
exception
when others then
DBMS_OUTPUT.PUT_LINE('Error ---------------' || sqlcode || ' : ' || sqlerrm );
end p_test;
/
然后执行下面的Java程序看看结果吧:
import java.sql.*;
import java.lang.*;
import oracle.jdbc.driver.*;
public class test
{
public static void main(String[] args)
{
ResultSet rs=null;
CallableStatement call=null;
String strTableName = "";// 表名
try
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@10.60.80.56:1521:MFGDB","trade0917","trade");
strTableName = "ModuleRight";// 执行完一遍后将ModuleRight换成lh_DB_manager再执行一下看看结果
call=conn.prepareCall("{ call p_test(?,?) }");
call.setString(1,strTableName);
call.registerOutParameter(2, OracleTypes.CURSOR);// 注册out参数的SQL数据类型
call.execute();
rs=(ResultSet)call.getObject(2);// 取得得数据结果集合
ResultSetMetaData rmeta = rs.getMetaData();//
int numColumns=rmeta.getColumnCount();// 确定数据集的字段个数
// 取得字段名
for(int i=1;i<=numColumns;i++)
{
if(i<numColumns)
System.out.print(rmeta.getColumnName(i)+" | ");
else
System.out.println(rmeta.getColumnName(i));
}
// 取出每一数据值
while(rs.next())
{
for(int i=1;i<=numColumns;i++)
{
if(i<numColumns)// 表中的字段不一定是字符类型,我在此没有判断并全部使用getString方法
System.out.print(rs.getString(i)+" | ");
else
System.out.println(rs.getString(i));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}