ORACLE 存储过程 练习七 数组专题
写在前面的废话
由于工作需要经常用到 ORACLE存储过程 其中数组是不可避免的一组成元素.那么让我们来体会一下 ORACLE存储过程的数组到低是如何使用的....
首先数组是一个数据类型(TYPE). 需要如下语句进行创建和声明.
create or replace type myvarray_list as varray(10) of varchar2(50)
1 数组作为过程的输入参数
create or replace procedure show_list_P( /*用于显示数组*/ p_varlist in myvarray_list ) is begin for x in 1..p_varlist.count loop dbms_output.put_line('p_varlist('||x||')='||p_varlist(x)); end loop; end;
-- 调用 call show_list_P(myvarray_list('Oracle','DB2','Sql Server','mySql','DBA'));
2 数组作为函数的返回值
create or replace function OUTPUT_list_P return myvarray_list -- PL/SQL存储过程里调用可变数组作为输出参数: as o_data myvarray_list:=myvarray_list(); begin for v_count in 1..5 loop o_data.extend; o_data(v_count):= v_count; -- dbms_output.put_line('list('||v_count||')='||o_data(v_count)); end loop; return o_data; end OUTPUT_list_P;
--调用 declare v_list myvarray_list; v_count number; begin select OUTPUT_list_P()into v_list from dual; for v_count in 1 ..v_list.count loop dbms_output.put_line('v_list('||v_count||')='||v_list(v_count)); end loop; end;
分类: PLSQL
+加关注
0
0
« 上一篇:ORA-000928:缺失SELECT 关键字
» 下一篇:ORACLE 字符串函数
posted @ 2013-02-01 21:40 cici_new_1987 阅读(326) 评论(0) 编辑 收藏
http://www.cnblogs.com/cici-new/archive/2013/02/01/2889598.html
原 Java调用存储过程(返回:简单类型、自定义对象、列表数组)
2012年03月20日 17:50:02 yindmbest 阅读数:988
由于公司使用的Jdevelope进行开发,有一套已经封装好的框架,因此调用存储过程非常简单,小弟今天突然想着能不能使用jdbc自主调用下下存储过程,包括各种返回类型,在参考网上的现有代码研究了两个下午之后,写了三个东西,也算是总结吧。
一、返回参数为简单类型,见代码:
-
package com.konkon.pk.call;
-
import java.sql.CallableStatement;
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.SQLException;
-
import java.sql.Types;
-
public class CallPkSimpleType {
-
public CallPkSimpleType() {
-
super();
-
}
-
public static void main(String[] args) {
-
Connection conn = null;
-
CallableStatement proc = null;
-
try {
-
Class.forName("oracle.jdbc.driver.OracleDriver");
-
try {
-
// 创建连接
-
conn = DriverManager.getConnection(
-
"jdbc:oracle:thin:@10.xx.xx.xx:1521:xxx", "xxx",
-
"xxxx");
-
// 调用pk
-
proc = conn
-
.prepareCall("{call PK_NB_DATACHECK.get_po_status_code(?,?,?,?)}");
-
// 设置参数
-
proc.setString(1, "100000000000388");
-
proc.registerOutParameter(2, Types.VARCHAR);
-
proc.registerOutParameter(3, Types.VARCHAR);
-
proc.registerOutParameter(4, Types.VARCHAR);
-
// 执行调用
-
proc.execute();
-
// 打印结果
-
System.out.println("保险合同号:" + proc.getString(2) + "\n" + "保单状态"
-
+ proc.getString(3) + "\n" + proc.getString(4));
-
// 关闭连接
-
if (null != proc) {
-
proc.close();
-
}
-
if (null != conn) {
-
conn.close();
-
}
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
}
二、返回参数为自定义类型,见代码:
-
package com.konkon.pk.call;
-
import java.sql.CallableStatement;
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.SQLException;
-
import java.sql.Types;
-
import oracle.jdbc.OracleTypes;
-
import oracle.sql.STRUCT;
-
/**
-
* CallPkObjType.java
-
* 作用:调用pk返回自定义对象,练习时使用
-
* 注意事项
-
*
-
* 注意: 本内容仅限于某某软件公司内部使用,禁止转发
-
* VERSION DATE BY CHANGE/COMMENT
-
* 1.0 2012-3-20 YinMeng create
-
*/
-
public class CallPkObjType {
-
public CallPkObjType() {
-
}
-
public static void main(String[] args) {
-
Connection conn = null;
-
CallableStatement proc = null;
-
try {
-
Class.forName("oracle.jdbc.driver.OracleDriver");
-
try {
-
// 创建连接
-
conn = DriverManager.getConnection(
-
"jdbc:oracle:thin:@10.xx.1.xx:1521:xxxx", "xx",
-
"xxx");
-
// 调用自定义
-
proc = conn
-
.prepareCall("{? = call PK_LIB_USRDTPROC.f99_get_usrdat(?,?)}");
-
// 设置参数
-
proc.registerOutParameter(1, Types.SMALLINT);
-
proc.setString(2, "10000103020");
-
proc.registerOutParameter(3, OracleTypes.STRUCT, "OB_ACCC");
-
proc.execute();
-
STRUCT str = (STRUCT) proc.getObject(3);
-
Object[] obj = str.getOracleAttributes();
-
if (null != obj) {
-
for (int i = 0; i < obj.length; i++) {
-
System.out.println(obj[i]);
-
}
-
}
-
System.out.println(proc.getString(1));
-
// 关闭连接
-
if (null != proc) {
-
proc.close();
-
}
-
if (null != conn) {
-
conn.close();
-
}
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
}
三、返回参数为自定义类型数组,见代码:
-
package com.konkon.pk.call;
-
import java.sql.CallableStatement;
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.SQLException;
-
import java.text.ParseException;
-
import java.text.SimpleDateFormat;
-
import java.util.ArrayList;
-
import java.util.List;
-
import oracle.jdbc.OracleTypes;
-
import oracle.sql.STRUCT;
-
import vlife.plsql.Rec_bag_627m1a;
-
import vlife.plsql.Rec_bag_627m1b;
-
/**
-
* CallPkTableType.java
-
* 作用:调用pk返回自定义列表对象,练习
-
* 注意事项
-
* 注意: 本内容仅限于某某软件公司内部使用,禁止转发
-
* VERSION DATE BY CHANGE/COMMENT
-
* 1.0 2012-3-20 YinMeng create
-
*/
-
public class CallPkTableType {
-
public CallPkTableType() {
-
}
-
public static void main(String[] args) throws ParseException {
-
Connection conn = null;
-
CallableStatement proc = null;
-
try {
-
Class.forName("oracle.jdbc.driver.OracleDriver");
-
try {
-
// 创建连接
-
conn = DriverManager.getConnection(
-
"jdbc:oracle:thin:@xxx.xx.xxx.xxx:1521:xxx", "xx",
-
"xxx");
-
// 调用自定义
-
proc = conn
-
.prepareCall("{call pk_bag_bag627m.bag764m_get_agin_his_info(?,?)}");
-
Object[] objs = null;
-
List<Rec_bag_627m1b> nt_rec_bag_re = null;
-
Rec_bag_627m1a rec_bag_627m1a = new Rec_bag_627m1a();
-
rec_bag_627m1a.setAgin_code(null);
-
rec_bag_627m1a.setAgin_name(null);
-
rec_bag_627m1a.setOperator_time_e(null);
-
rec_bag_627m1a.setManager_code(null);
-
rec_bag_627m1a.setOperator_time_s(null);
-
proc.setObject(1, rec_bag_627m1a);
-
proc.registerOutParameter(2, OracleTypes.ARRAY,
-
"NT_REC_BAG_627M1B");
-
proc.execute();
-
Object[] obj = (Object[]) proc.getArray(2).getArray();
-
nt_rec_bag_re = new ArrayList<Rec_bag_627m1b>();
-
if (null != obj) {
-
Rec_bag_627m1b rec_b = null;
-
Rec_bag_627m1b p_rec = null;
-
// 格式化时间
-
SimpleDateFormat smf = new SimpleDateFormat("yyyy-mm-dd");
-
// 获取职级开始时间
-
java.util.Date leav_s_util = null;
-
java.sql.Date leav_s = null;
-
// 修改时间
-
java.util.Date modi_util = null;
-
java.sql.Date modi = null;
-
// 实例循环
-
for (Object rec : obj) {
-
objs = ((STRUCT) rec).getAttributes();
-
if (null != objs) {
-
// 职级开始时间数据
-
if (("".equals(objs[4])) || null == objs[4]) {
-
leav_s = null;
-
} else {
-
leav_s_util = smf.parse(objs[4].toString());
-
leav_s = new java.sql.Date(leav_s_util
-
.getTime());
-
}
-
// 操作时间数据获取
-
if (("".equals(objs[9])) || null == objs[9]) {
-
modi = null;
-
} else {
-
modi_util = smf.parse(objs[9].toString());
-
modi = new java.sql.Date(modi_util.getTime());
-
}
-
rec_b = new Rec_bag_627m1b();
-
rec_b.setManagerment((String) objs[0]);
-
rec_b.setAgincode((String) objs[1]);
-
rec_b.setAginname((String) objs[2]);
-
rec_b.setAginlevel((String) objs[3]);
-
rec_b.setLevel_time_s(leav_s);
-
rec_b.setDepart_code((String) objs[5]);
-
rec_b.setDepart_name((String) objs[6]);
-
rec_b.setAgin_level_name((String) objs[7]);
-
rec_b.setModi_type((String) objs[8]);
-
rec_b.setModi_time(modi);
-
rec_b.setOperator_id((String) objs[10]);
-
nt_rec_bag_re.add(rec_b);
-
}
-
}
-
for (int i = 0; i < nt_rec_bag_re.size(); i++) {
-
p_rec = nt_rec_bag_re.get(i);
-
System.out.println(p_rec.getModi_time());
-
}
-
}
-
// 关闭连接
-
if (null != proc) {
-
proc.close();
-
}
-
if (null != conn) {
-
conn.close();
-
}
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
}
注意:如果输出的参数结果中有中文,有时候会有乱码的现象,可以下载语言包(http://download.csdn.net/detail/kxcc_sx/393164#comment)并添加到环境中就可以了,我的是这样的,对于jdk版本比较低的可能还需要对应的oracle驱动包。
https://blog.csdn.net/yindmbest/article/details/7374777
存储过程返回VARRAY类型,急,在线等待 [问题点数:0分]
- 收藏帖子
- 回复
结帖率 100%
我的程序如下
create or replace package TTTT is
type CarBoatInfo is ref cursor;
TYPE testtype is record
(aa number(1),
bb varchar2(10));
TYPE vtest is VARRAY(10) of TESTTYPE;
PROCEDURE test_ret(abc out vtest);
end TTTT;
create or replace package body TTTT is
PROCEDURE test_ret(abc out vtest) IS
ret testtype;
BEGIN
if abc is NULL then
dbms_output.put_line('aa is NUll');
end if;
ret.aa := 1;
ret.bb := '1';
abc := vtest(ret);
END test_ret;
我在JAVA中调用这个存储过程
java.sql.ResultSet rs= null;
java.sql.CallableStatement cs= null;
java.sql.Connection conn= null;
try {
conn= this.getConnection();
} catch (BaseException ex) {
throw new BaseException("E020023", ex);
}
try {
try {
conn.setAutoCommit(true);
oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("{call tttt.test_ret(?)}");
oracle.jdbc.OracleTypes.ARRAY, "tttt.VTEST");
stmt.execute(); //执行到这里抛出异常
不知道事什么原因 ,各位大虾救命!
问题点数:0分
0 2003-06-12 16:26:01
回复数 2 只看楼主 引用 举报 楼主
VARRAY是不可以作为返回参数到前端的,它只可以作为输出参数在procedure,function等oracle 内部使用。
0 2003-06-13 12:48:52
只看TA 引用 举报 #1 得分 0
STM32之中断与事件---一个使用GPIO作为外部中断的示例1.GPIO 的正确设置GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO
varray是在oracle内自定义的类型,不能作为输出参数的。可以考虑用引用游标传参数出去。
https://bbs.csdn.net/topics/30302419