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;
这是看了弱水老大和一位高手讨论后学到的,希望能帮助你。

解决方案 »

  1.   

    uje(sky) :
    感谢回答,但是JSP中不认识"OracleTypes.CURSOR", 用什么可以替换呢?
      

  2.   

            
            在基于多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();
            }
        }
    }
      

  3.   

    import oracle.jdbc.*;就可以了。