1、nest表组合成结果集,然后以游标变量的形式返回

--创建类型

create or replace package mytest is

-- Author  : ADMINISTRATOR
  -- Created : 2008-5-13 11:19:28
  -- Purpose : test
 
TYPE record_type IS RECORD(
      code   VARCHAR2(18),
      p_name VARCHAR2(16));

TYPE ref_cur_type IS REF CURSOR;
end mytest;

CREATE OR REPLACE TYPE table_type IS TABLE OF record_type;

--创建过程

CREATE OR REPLACE PROCEDURE testproc( v_ref_cur out mytest.ref_cur_type) IS

v_record record_type;

v_table table_type := table_type();

BEGIN
   FOR i IN 1 .. 9 LOOP
      v_record := NEW record_type('45212319830810435' || i, '侯廷文' || i);
      v_table.EXTEND;
      v_table(i) := v_record;
   END LOOP;

OPEN v_ref_cur FOR
      SELECT * FROM TABLE(CAST(v_table AS table_type));

END testproc;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
                .prepareCall(&{call testproc(?)}&);
        cstmt.registerOutParameter(1, OracleTypes.CURSOR);
        cstmt.execute();
        ResultSet rs = (ResultSet) cstmt.getObject(1);
        while (rs.next()) ...{
            System.out.print(rs.getString(1) + & &);
            System.out.print(rs.getString(2) + & &);
            System.out.println();
        }

2、PL/SQL varray数组类型的形式返回结果

--创建类型
CREATE OR REPLACE TYPE myarr IS VARRAY(200) OF VARCHAR2(256);

--创建过程

CREATE OR REPLACE PROCEDURE testvarray(thearr OUT myarr) IS

BEGIN
   thearr := myarr();
   FOR i IN 1 .. 100 LOOP
      thearr.EXTEND;
      thearr(i) := '我是侯廷文'||i;
   END LOOP;
END testvarray;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con.prepareCall(&{call testvarray(?)}&);
        cstmt.registerOutParameter(1, OracleTypes.ARRAY, &MYARR&);

    cstmt.execute();
        ARRAY array = cstmt.getARRAY(1);
        Datum[] datas = array.getOracleArray();

for (int i = 0; i < datas.length; i++) ...{
            System.out.println(i + &:& + new String(datas[i].getBytes()));
        }

3、PL/SQL 的Object类型返回,对应jdbc的Struct

--创建类型

CREATE OR REPLACE TYPE record_type as object(code VARCHAR2(18),
                                             p_name VARCHAR2(16));

--创建过程

create or replace procedure testStruct(theObj OUT record_type) is
begin
  theObj:=record_type('452134198308104351','侯廷文');
end testStruct;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
                .prepareCall(&{call testStruct(?)}&);
        cstmt.registerOutParameter(1, OracleTypes.STRUCT, &RECORD_TYPE&);
        cstmt.execute();
        STRUCT struct = cstmt.getSTRUCT(1);
        Datum[] datas = struct.getOracleAttributes();
      for (int i = 0; i < datas.length; i++) ...{
            System.out.print(i + &:& + new String(datas[i].shareBytes()));
            System.out.println();
        }

4、PL/SQL 的table类型返回,对应jdbc的ARRAY

--创建类型

create or replace type nest_table_type IS TABLE OF VARCHAR2(200);

--创建过程

CREATE OR REPLACE PROCEDURE testtable(thetable OUT nest_table_type) IS
BEGIN
   thetable := nest_table_type();
   FOR i IN 1 .. 100 LOOP
      thetable.EXTEND;
      thetable(i) := dbms_random.STRING('X', 3) || '侯廷文' || i;
   END LOOP;
END testtable;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
         .prepareCall(&{call testtable(?)}&);
         cstmt.registerOutParameter(1, OracleTypes.ARRAY, &NEST_TABLE_TYPE&);
         cstmt.execute();
         ARRAY array = cstmt.getARRAY(1);
         Datum[] datas=array.getOracleArray();
         for (int i = 0; i < datas.length; i++) ...{
         System.out.print(i + &:& + new String(datas[i].shareBytes()));
         System.out.println();
         }

5、PL/SQL 的Index table类型,注意该类型只能在
   oci8方式连接下使用,所需要的动态连接库文件(ocijdbc9.dll)要在环境变量里进行设置
   (例如:path=D:oracleora90BIN),在不同的环境下OCI驱动还可能出现类装载异常,
   所以返回索引表尽管方便,但偶尔会出现意想不到的错误

--创建类型

CREATE OR REPLACE PACKAGE p_type IS
TYPE index_table_type IS TABLE OF VARCHAR2(256) INDEX BY BINARY_INTEGER;
END;

--创建过程

create or replace procedure testIndexTable(v_iTable OUT p_type.index_table_type) is
begin
  FOR i IN 1 .. 100 LOOP
  v_iTable(i):=dbms_random.string('X',5)||'侯廷文'||i;END LOOP;
end testIndexTable;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
                .prepareCall(&{call testindextable(?)}&);
        cstmt.registerIndexTableOutParameter(1, 200, OracleTypes.VARCHAR, 256);
        cstmt.execute();
        String[] strs = (String[]) cstmt.getPlsqlIndexTable(1);
        for (int i = 0; i < strs.length; i++) ...{
            System.out.println(i + &:& + strs[i]);
        }

6、nestTable里装的是Person Object

--创建类型

CREATE OR REPLACE TYPE Person AS OBJECT
(
       p_code VARCHAR2(32),
       p_name VARCHAR2(16),
       p_age NUMBER,
       p_birthday DATE
);

CREATE OR REPLACE TYPE person_table_type IS TABLE OF Person;

--创建过程

CREATE OR REPLACE PROCEDURE testtableofobject(v_table OUT person_table_type) IS
BEGIN
   v_table := person_table_type();
   FOR i IN 1 .. 5 LOOP
      v_table.EXTEND;
      v_table(i) := NEW person('45212319880810435' || i,
                               '侯廷文' || i,
                               20 + i,
                               to_date('1985-08-1' || i, 'YYYY-MM-DD'));
   END LOOP;
END testtableofobject;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
                .prepareCall(&{call testtableofobject(?)}&);
       cstmt.registerOutParameter(1, OracleTypes.ARRAY, &person_table_type&
                .toUpperCase());
        cstmt.execute();
        ARRAY array = cstmt.getARRAY(1);
        Datum[] datas = array.getOracleArray();
        for (int i = 0; i < datas.length; i++) ...{
            System.out.print(i + &: &);
            Datum[] personAttributes = ((STRUCT) datas[i])
                    .getOracleAttributes();
            System.out.print(&p_code:&
                    + new String(personAttributes[0].getBytes()) + & &);
            System.out.print(&p_name:&
                    + new String(personAttributes[1].getBytes()) + & &);
            System.out.print(&p_age:& + personAttributes[2].intValue() + & &);
            System.out.print(&p_birthday:& + personAttributes[3].dateValue()
                    + & &);
            System.out.println();
        }

7、输入参数为nestTable里装的是Person Object
   注意要将nls_charset12.jar放入ClassPath中,否则报SQLException:
   Non supported character set: oracle-character-set-852

--创建类型

CREATE OR REPLACE TYPE Person AS OBJECT
(
       p_code VARCHAR2(32),
       p_name VARCHAR2(16),
       p_age NUMBER,p_birthday DATE
);

CREATE OR REPLACE TYPE person_table_type IS TABLE OF Person;

CREATE TABLE personTable OF person;

--创建过程

CREATE OR REPLACE PROCEDURE testInPersons(persons IN person_table_type) IS
BEGIN
FORALL i IN persons.first .. persons.count
INSERT INTO personTable VALUES(persons(i));
COMMIT;
END testInPersons;

--java代码:

OracleCallableStatement cstmt = (OracleCallableStatement) con
                .prepareCall(&{call testInPersons(?)}&);
        StructDescriptor sd = new StructDescriptor(&PERSON&, con);
        Object[] personAttrs1 = new Object[] ...{ &This is code11&, &侯廷文11&,
                new NUMBER(32), new Date(new java.util.Date().getTime()) };
        STRUCT person1 = new STRUCT(sd, con, personAttrs1);

Object[] personAttrs2 = new Object[] ...{ &This is code22&, &侯廷文22&,
                new NUMBER(33), new Date(new java.util.Date().getTime()) };
        STRUCT person2 = new STRUCT(sd, con, personAttrs2);

ArrayDescriptor ad = new ArrayDescriptor(&person_table_type&
                .toUpperCase(), con);
        ARRAY persons = new ARRAY(ad, con, new STRUCT[] ...{ person1, person2 });
        cstmt.setARRAY(1, persons);
        cstmt.execute();
    }

Oracle存储过程java 调用的更多相关文章

  1. oracle存储过程递归调用

    oracle存储过程递归调用,如果where子句使用的是传入的参数, 在以后的递归调用中参数就是第一次调用的参数值,解决办法是定义变量,使用自定义的变量问题可以解决.

  2. mysql 触发器 存储过程 java调用

    触发器和存储过程是为了提高SQL的运行效率. SQL语句先编译.后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用. 随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不 ...

  3. Oracle存储过程的调用(返回参数)

    CREATE OR REPLACE PROCEDURE test_in_out_exception (v_empno VARCHAR2,v_guess_sal NUMBER,v_true_sal OU ...

  4. oracle存储过程jdbc调用

    package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...

  5. oracle 存储过程中调用存储过程

    create procedure sp_name() begin ……… end 比如: create procedure pro_showdbs() show datebase; end //用ex ...

  6. Oracle存储过程的调用和执行

    1.什么是存储过程: 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2.无参存储过程的使用: Normal 0 7.8 磅 0 2 fals ...

  7. Oracle存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符

    前几天编写一个存储过程,需要访问远程数据库的字段,于是建立一个dbLink并建了同义词: CREATE PUBLIC DATABASE LINK orcl@dbc CONNECT TO orcl ID ...

  8. Oracle存储过程创建及调用(转)

    在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...

  9. jdbc调用 oracle 存储过程操作

    创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 cr ...

随机推荐

  1. loj 1308(点双连通分量应用)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27016 题意:求一个连通图去掉任意一个点以及与它相连的边,图中的所 ...

  2. 建模算法(五)——图与网络

    (一)图与网络的基本概念 一.无向图 含有的元素为顶点,弧和权重,但是没有方向 二.有向图 含有的元素为顶点,弧和权重,弧具有方向. 三.有限图.无限图 顶点和边有限就是有限图,否则就是无限图. 四. ...

  3. TextView属性大全

    今天研究了TextView一天了,发现网上有一篇讲TextView属性的,非常全,收藏一下先. 发现TextView有一个比较大的问题,就是文字排版的问题,遇到数字,字母,符号等就会有问题,目前还没有 ...

  4. mysql一次插入多条数据

    mysql一次插入多条数据: INSERT INTO hk_test(username, passwd) VALUES ('qmf2', 'qmf2'),('qmf3', 'qmf3'),('qmf4 ...

  5. Web测试Selenium:如何选取元素

    Web测试工具Selenium:如何选取元素 2009-02-17 23:23 by 敏捷的水, 5372 阅读, 22 评论, 收藏, 编辑 selenium是一个非常棒的Web测试工具,他对Aja ...

  6. Knowledgeroot安装与使用入门

    采用 PHP 开发的知识库系统,基于树状结构对内容进行组织.使用 FCKEditor 进行内容编辑. 效果http://demo.knowledgeroot.org/index.php?id=2230 ...

  7. SU Demos-02Filtering-05Suk1k2filter

    本人数学不咋地,本demo也是一知半解,敬请谅解. 这是生成的脉冲数据

  8. 解决eclipse中git插件中的cannot open git-upload-pack问题

    有时候在eclipse上使用插件egit向github或者osc上同步代码时,有时候会发现出现cannot open git-upload-pack这个问题. 一般引起这个问题的原因有两个:一.网络问 ...

  9. 简单几何(数学公式+凸包) UVA 11168 Airport

    题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...

  10. TYVJ P1075 硬币游戏 Label:dp

    背景 农民John的牛喜欢玩硬币,所以John就为它们发明了一个新的两人硬币游戏,叫做Xoinc. 描述 最初地面上有一堆n个硬币(5<=n<=2000),从上面数第i个硬币的价值为C_i ...