失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Java调用存储过程(返回:简单类型VARCHAR 自定义对象STRUCT 列表数组VARRAY)

Java调用存储过程(返回:简单类型VARCHAR 自定义对象STRUCT 列表数组VARRAY)

时间:2020-10-21 17:41:14

相关推荐

Java调用存储过程(返回:简单类型VARCHAR 自定义对象STRUCT 列表数组VARRAY)

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)isbeginfor x in 1..p_varlist.count loopdbms_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存储过程里调用可变数组作为输出参数:aso_data myvarray_list:=myvarray_list(); beginfor v_count in 1..5 loopo_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;

--调用declarev_list myvarray_list;v_count number;beginselect OUTPUT_list_P()into v_list from dual;for v_count in 1 ..v_list.count loopdbms_output.put_line('v_list('||v_count||')='||v_list(v_count));end loop;end;

分类:PLSQL

好文要顶关注我收藏该文

cici_new_1987

关注 - 1

粉丝 - 13

+加关注

0

0

«上一篇:ORA-000928:缺失SELECT 关键字

»下一篇:ORACLE 字符串函数

posted @-02-01 21:40cici_new_1987阅读(326) 评论(0)编辑收藏

/cici-new/archive//02/01/2889598.html

原 Java调用存储过程(返回:简单类型、自定义对象、列表数组)

03月20日 17:50:02yindmbest阅读数: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 -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 -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();

}

}

}

注意:如果输出的参数结果中有中文,有时候会有乱码的现象,可以下载语言包(/detail/kxcc_sx/393164#comment)并添加到环境中就可以了,我的是这样的,对于jdk版本比较低的可能还需要对应的oracle驱动包。

/yindmbest/article/details/7374777

CSDN论坛>Oracle>高级技术

存储过程返回VARRAY类型,急,在线等待[问题点数:0分]

收藏帖子回复

yexingzhe

结帖率 100%

我的程序如下

createorreplacepackageTTTTis

typeCarBoatInfoisrefcursor;

TYPEtesttypeisrecord

(aanumber(1),

bbvarchar2(10));

TYPEvtestisVARRAY(10)ofTESTTYPE;

PROCEDUREtest_ret(abcoutvtest);

endTTTT;

createorreplacepackagebodyTTTTis

PROCEDUREtest_ret(abcoutvtest)IS

rettesttype;

BEGIN

ifabcisNULLthen

dbms_output.put_line('aaisNUll');

endif;

ret.aa:=1;

ret.bb:='1';

abc:=vtest(ret);

ENDtest_ret;

我在JAVA中调用这个存储过程

java.sql.ResultSetrs=null;

java.sql.CallableStatementcs=null;

java.sql.Connectionconn=null;

try{

conn=this.getConnection();

}catch(BaseExceptionex){

thrownewBaseException("E020023",ex);

}

try{

try{

conn.setAutoCommit(true);

oracle.jdbc.OracleCallableStatementstmt=(oracle.jdbc.OracleCallableStatement)conn.prepareCall("{calltttt.test_ret(?)}");

oracle.jdbc.OracleTypes.ARRAY,"tttt.VTEST");

stmt.execute();//执行到这里抛出异常

不知道事什么原因,各位大虾救命!

问题点数:0分

0-06-12 16:26:01

回复数2只看楼主引用举报楼主

皮皮

VARRAY是不可以作为返回参数到前端的,它只可以作为输出参数在procedure,function等oracle内部使用。

0-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

tarky_z

varray是在oracle内自定义的类型,不能作为输出参数的。可以考虑用引用游标传参数出去。

/topics/30302419

如果觉得《Java调用存储过程(返回:简单类型VARCHAR 自定义对象STRUCT 列表数组VARRAY)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。