java 调用oracle的存储过程返回记录集

2019-03-02 23:42|来源: 网路


从oracle存储过程返回记录集
关键字:java,cursor,oracle
出处:NET7B.COM
内容或简介:
   -- NET7B.COM(STORM)

关于数据库的游标(cursor)大家肯定都接触不少,我们可以通过OPEN,FETCH,CLOSE操作控制游标进
行各种方便的操作,这方面的例子我就不在重复了。我们现在要介绍的是游标变量(cursor variable)。
类似游标,游标变量也是指向一个查询结果集的当前行。不同的是,游标变量能为任何类型相似
(type-compatible)的查询打开,而并不是绑定到某一个特定的查询。通过游标变量,你可以在数据
库的数据提取中获得更多的方便。



//=============================================
// 定义包、及存储过程
// 请注意游标变量的声明和使用的方法
// 这里的游标是输出(out)参数
//=============================================
create or replace package audit is

  -- Public type declarations, cursor variable
  type  outList        is ref cursor;

  PROCEDURE sp_audit_GetTaxpayerList(organize in varchar2, taxpayerList out outList);
                                                         
end audit;

create or replace package body audit is
    -- taxpayerList is cursor variable
  PROCEDURE sp_audit_GetTaxpayerList(organize in varchar2, taxpayerList out outList)
  is 
  begin
    OPEN taxpayerList 
    FOR
      select  
            strName , strTelephone 
      from "TB_PERSONINFO" a 
    WHERE a.organize = organize  ; 
                     
  end;

end audit;


//=============================================
// 下面是java 源码,从oracle存储过程读取记录集
// 注意一定要用oracle的jdbc API ( 可以从oracle网站下载 )
//=============================================
try
{
        Connection conn = null;
        ResultSet rs = null;
        
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:ora","net7b.com","net7b");
        
        oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("{call audit.sp_audit_GetTaxpayerList(?, ?)}");
        stmt.setString( 1, "23201020100");
        stmt.registerOutParameter( 2, oracle.jdbc.OracleTypes.CURSOR );
        stmt.execute();
        rs =  stmt.getCursor( 2 );
        for (int i = 0; rs.next();)
        {
                System.out.println(" ----["+ i +"]name:" + rs.getString(1) + "telephone:" + rs.getString(2));
        }
}
catch (Exception ex)
{
        ex.printStackTrace();
}




这个是用游标变量作为输入(in)参数的例子一部分。我不必废话,相信大家可以自己试着编写这样
的一个例子了。

PROCEDURE open_cv (generic_cv IN OUT GenericCurTyp,choice NUMBER) IS
BEGIN
    IF choice = 1 THEN
        OPEN generic_cv FOR SELECT * FROM emp;
    ELSIF choice = 2 THEN
        OPEN generic_cv FOR SELECT * FROM dept;
    ELSIF choice = 3 THEN
        OPEN generic_cv FOR SELECT * FROM salgrade;
    END IF;
...
END;





我们不仅可以使用PL/SQL开发存储过程,而且还可以使用Java语言来开发存储过程(Java Stored Procedures)。
如果大家感兴趣的话,也可以看看有关用法。不过着就是我们这文章的题外话了,而且网上好像也有不少这
方面的资料了  --- ^_^

转自:http://www.cnblogs.com/SunJavaLiu/articles/39384

相关问答

更多
  • 应该采用jdbc方式吧, 在javaSE api中,java.sql.Connection 中有如下方法参考: CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) 创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 CallableStatement prepareCall(String sql, int resultSet ...
  • oracle 存储过程: a2265 写的格式; java 调用: Connection conn = null; CallableStatement cstmt = null; ResultSet rs = null; String sql = "{ call $prco_name(?,?,?) }"; cstmt = conn.prepareCall(sql); cstmt.setInt(1, 23); cstmt.setInt(2, 12); cstmt.registerOutParameter(3, ...
  • crreate or replace package pk_comm type my_curose is ref cursor end pk_comm; declare v_name varchar2(20); v_curor pk_comm.my_cursor; begin open v_cursor for select empname from emp; fetch v_cursor into v_name; dbms_output.put_line('empname='||v_name); end ...
  • 你直接返回要用什么数据类型来接收呢? T-SQL中可没有LIST这玩意儿. 当然了,如果你非常肯定你返回的数据只有一条或者只是唯一确定的,那就可以用oracle支持的数据类型来接收了
  • 1:首先你需要创建一个包,并定义你返回的游标的类型、存储过程 create or replace package TEST_PKG is type cur_emp is REF CURSOR; procedure test_proc (emps out cur_emp); end TEST_PKG; 2:然后你再创建包体 create or replace package body TEST_PKG is procedure test_proc (emps out cur_emp) as begin ope ...
  • 这个存储过程你可以在TEST的环境下查看结果,不过你需要隐式游标来进行操作,那样才能看到,具体步骤如下: 1、首先我们要借助游标,因此需要先定义一个返回类型的游标 create or replace package type_difinition as type mycursor is ref cursor; end type_difinition; 2、改写你的存储过程,要想查看执行SQL后结果需要一个返回参数,这个参数即上面定义的游标 类型 create or replace procedure sel ...
  • 存储过程: CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; PROCEDURE get (p_id NUMBER, p_rc OUT myrctype); END pkg_test; / CREATE OR REPLACE PACKAGE BODY pkg_test AS PROCEDURE get (p_id NUMBER, p_rc OUT myrctype) IS sqlstr VARCHAR2 (500); BEG ...
  • 用于PL / SQL和TSQL的编程模型是不同的。 你可以在TSQL中返回一个记录集,在PL / SQL中你会返回一个游标。 游标只是一个指向打开并可以读取的SQL语句的指针。 它不仅限于返回单个列。 粗略地说,上面的TSQL过程的PL / SQL等价物将类似于: CREATE OR REPLACE FUNCTION GET_INPUT_LOCATION(pinInput_location IN VARCHAR2(255)) RETURN SYS_REFCURSOR IS cCursor SYS_ ...
  • 您可以使用SET FMTONLY [ON|OFF]检查SQL语句生成的结果集格式。 Reporting Services等MS工具使用此技术来确定输出结果集的结构。 这对于存储过程来说很棘手,因为输出结果集的数量和结构可能会根据输入参数值而有所不同。 如果您的程序代码非常重要,那么即使使用严格的编码标准,也很难解决这个问题。 我见过其他方法(例如使用扩展参数),但没有一种方法是绝对可靠的。 让开发人员勾选方框可能是最好的解决方案。 You can inspect the resultset format p ...
  • 弄清楚了。 createStatement不工作,因此使用PrepareStatement尝试如下。 try { Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); System.setProperty("DUCANACCESS_HOME","C:/Users/mindurka/Downloads /Selenium3.4/UCanAccess-4.0.2-bin/UCanAccess-4 ...