Oracle存储过程java 调用
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 调用的更多相关文章
- oracle存储过程递归调用
oracle存储过程递归调用,如果where子句使用的是传入的参数, 在以后的递归调用中参数就是第一次调用的参数值,解决办法是定义变量,使用自定义的变量问题可以解决.
- mysql 触发器 存储过程 java调用
触发器和存储过程是为了提高SQL的运行效率. SQL语句先编译.后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用. 随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不 ...
- Oracle存储过程的调用(返回参数)
CREATE OR REPLACE PROCEDURE test_in_out_exception (v_empno VARCHAR2,v_guess_sal NUMBER,v_true_sal OU ...
- oracle存储过程jdbc调用
package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...
- oracle 存储过程中调用存储过程
create procedure sp_name() begin ……… end 比如: create procedure pro_showdbs() show datebase; end //用ex ...
- Oracle存储过程的调用和执行
1.什么是存储过程: 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2.无参存储过程的使用: Normal 0 7.8 磅 0 2 fals ...
- Oracle存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符
前几天编写一个存储过程,需要访问远程数据库的字段,于是建立一个dbLink并建了同义词: CREATE PUBLIC DATABASE LINK orcl@dbc CONNECT TO orcl ID ...
- Oracle存储过程创建及调用(转)
在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...
- jdbc调用 oracle 存储过程操作
创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 cr ...
随机推荐
- 建模算法(三)——非线性规划
一.非线性规划和线性规划不同之处 1.含有非线性的目标函数或者约束条件 2.如果最优解存在,线性规划只能存在可行域的边界上找到(一般还是在顶点处),而非线性规划的最优解可能存在于可行域的任意一点达到. ...
- Android中的.9.png
智能手机中经常有自动横屏的功能,同一幅界面在随着手机(或平板电脑)中的方向传感器会改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化产生拉伸,造成图形的变形.例如下面一个在竖屏时正常显 ...
- SQL Server:在事务中回滚TRUNCATE操作
我们一般都认为TRUNCATE是一种不可回滚的操作,它会删除表中的所有数据以及重置Identity列. 如果你在事务中进行TRUNCATE操作,就能回滚.反之,它就不会从日志文件文件恢复数据.它不会在 ...
- SU Demos-02Filtering-07Sumedian
不足之处,欢迎批评指正. 先看脚本内容: 脚本中用到的4个参数文件,是一系列x,t数据对,数组(x,t) 运行结果,
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- Android SDK Manager无法更新,内容显示不全的解决办法
最近在初学android开发,在更新SDK的时候遇到了麻烦. 发现Extras文件夹下为空,没有内容,包括sdk列表也不全面,更新也没有反应 解决方法: 1.在SDK Manager下Tools-&g ...
- 首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)
http://blog.csdn.net/wangrenzhu2011/article/details/8175492 (转) 在metro 风格中 动态磁贴是他的精髓 在wp7 的开发中 我们可以使 ...
- const放在函数前和放在函数后
template < class T, class container = vector<T> > class MyClass{ private: T value; publi ...
- HDU 4605 Magic Ball Game(离线算法)
题目链接 思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了. #pragma comment(linker, "/STACK:1 ...
- BZOJ3236: [Ahoi2013]作业
Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...