Some print.
Some print.
~SingleForum~无废话记录~ + ~19~记录点有用的好吗?少说废话少装b~

~SingleForum~无废话记录~ » other

存储过程返回结果集

Started 8 months ago by admin. | Tags: . .

首先要明确一个概念
PROCEDURE TRIGGER PACKAGE 的区别
简单的说,PROCEDURE, TRIGGER都是一段程序
但PROCEDURE需要手工调用,TRIGGER满足你设定的条件会自动执行
PACKAGE是 把几个程序封装在一起,和JAVA里的PACKAGE的概念差不多。

得到返回的结果集需要建立PACKAGE,并且返回列表需要通过返回游标实现

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。

1、在SQL*PLUS中建一个程序包(在包中定义了一个类型游标)

CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
procedure TESTC(cur_ref out Test_CURSOR);
end TESTPACKAGE;

2、建立包之后建立存储过程

create or replace package body TESTPACKAGE as
procedure TESTC(cur_ref out Test_CURSOR) is
begin
OPEN cur_ref FOR select * from test;
end TESTC;
END TESTPACKAGE;

可以看到,它是把游标(cursor)(可以理解为一个指针),作为一个out 参数来返回值的。

JAVA调用程序如下:

JAVA:
  1. package com.rizon.tree.excelApi;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7.  
  8. public class CursorTest {
  9.  
  10.     public static void main(String[] args) throws ClassNotFoundException,
  11.             SQLException {
  12.         Connection conn = null;
  13.         ResultSet rs = null;
  14.         try {
  15.  
  16.             Class.forName("oracle.jdbc.driver.OracleDriver");
  17.             conn = DriverManager.getConnection(
  18.                     "jdbc:oracle:thin:@10.0.41.100:1521:orcl", "forestrytree",
  19.                     "forestrytree");
  20.  
  21.             oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement) conn
  22.                     .prepareCall("{call TESTPACKAGE.TESTC(?)}");
  23.             // stmt.setString(1, "1");
  24.             stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
  25.             stmt.execute();
  26.             rs = stmt.getCursor(1);
  27.             for (int i = 0; rs.next();) {
  28.                 System.out.println(" ----[" + i + "]name:" + rs.getString(1)
  29.                         + "telephone:" + rs.getString(2));
  30.             }
  31.         } catch (Exception ex) {
  32.             ex.printStackTrace();
  33.         } finally {
  34.  
  35.             if (conn != null) {
  36.                 conn.close();
  37.                 conn = null;
  38.             }
  39.  
  40.             if (rs != null) {
  41.                 rs.close();
  42.                 rs = null;
  43.             }
  44.         }
  45.  
  46.     }
  47.  
  48. }

RSS feed for this topic