首先当然是在oracle中建立type

CREATE OR REPLACE TYPE cux_proxy_bid_award_rec IS OBJECT
(
trading_partner_id NUMBER,
bid_price NUMBER,
bid_publish_date DATE,
bid_award_flag VARCHAR2(10)
);

再建立引用type

CREATE OR REPLACE TYPE cux_proxy_bid_award_tbl IS TABLE OF CUX_PROXY_BID_AWARD_REC;

java中调用

import java.util.ArrayList;
import java.sql.SQLException; import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor; import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleConnection; public void crtSuppResponseAndBidAward(String auctionHeaderId){
java.util.ArrayList array = new java.util.ArrayList(); PonSourceProxyBidVOImpl vo = this.getPonSourceProxyBidVO1();
vo.first();
vo.previous();
while(vo.hasNext()){
Row row = vo.next();
Object[] obj = new Object[4];
obj[0] = (Number)row.getAttribute("TradingPartnerId");
obj[1] = (Number)row.getAttribute("BidPrice");
obj[2] = (Date)row.getAttribute("BidPublishDate");
obj[3] = (String)row.getAttribute("BidAwardFlag")!=null?row.getAttribute("BidAwardFlag"):"N";
//构造ArrayList
array.add(obj);
} OracleCallableStatement statement = null;
OracleConnection oracleConnection = (OracleConnection)this.getOADBTransaction().getJdbcConnection();
try{
//将arraylist解析为STRUCT
STRUCT[] arrayOfSTRUCT = createMyRows(oracleConnection, array); //此处使用引用的TYPE
//不能调用在PACKAGE中定义的TYPE
ArrayDescriptor tableOfBidDescriptor =
ArrayDescriptor.createDescriptor("CUX_PROXY_BID_AWARD_TBL",
oracleConnection); ARRAY localARRAY = new ARRAY(tableOfBidDescriptor, oracleConnection, arrayOfSTRUCT); OracleCallableStatement stmt = (OracleCallableStatement)getOADBTransaction().createCallableStatement("{ call CUX_PON_SOURCING_PUB.AUTO_CRT_BID_AWARD(:1, :2, :3, :4, :5) }", -1); String aucHeaderIdEncrypt = SourcingServerUtil.URLEncrypt(getOADBTransaction(), auctionHeaderId );
stmt.setString(1, aucHeaderIdEncrypt);
stmt.setString(2, auctionHeaderId);
stmt.setARRAY(3, localARRAY);
stmt.registerOutParameter(4, Types.NUMERIC);
stmt.registerOutParameter(5, Types.VARCHAR);
stmt.execute();
oracle.sql.NUMBER retState = stmt.getNUMBER(4);
retState.toString();
System.out.println("stmt.getNUMBER(4) "+stmt.getNUMBER(4));
LogUtil.of(" String.valueOf(stmt.getNUMBER(4)) "+String.valueOf(stmt.getNUMBER(4))+" retState "+retState.stringValue(), this).print(this); ModelUtil.commit(this, true); String retStatus = stmt.getNUMBER(4).stringValue() ;
String retMsg = stmt.getString(5); if( "0".equals(retStatus)){
OAException dialogMsg = new OAException("决标完成!", OAException.CONFIRMATION);
this.getOADBTransaction().putDialogMessage(dialogMsg);
}else{
throw new OAException(retMsg);
} }catch(SQLException e){
throw OAException.wrapperException(e);
} } ////将arraylist解析为STRUCT
private STRUCT[] createMyRows(Connection paramConnection,
java.util.ArrayList paramArrayList) { int j = paramArrayList.size();
STRUCT[] arrayOfSTRUCT;
try {
//此处使用定义的原始TYPE OBJECT,或者TABLE
StructDescriptor localStructDescriptor =
StructDescriptor.createDescriptor("CUX_PROXY_BID_AWARD_REC",
paramConnection);
int k;
arrayOfSTRUCT = new STRUCT[j]; for (k = 0; k < j; k++) {
arrayOfSTRUCT[k] =
new STRUCT(localStructDescriptor, paramConnection,
(Object[])paramArrayList.get(k));
} } catch (Exception localException) {
throw OAException.wrapperException(localException);
} return arrayOfSTRUCT;
}

参考:

oracle存储过程输入输出数组对象和java调用情况

如何把java中的arrayList转化为oracle中的数组(array)

在PL/SQL中直接使用ORACLE数组

DECLARE

  l_rec cux_proxy_bid_award_tbl := cux_proxy_bid_award_tbl();
BEGIN
FOR i IN 1 .. 5 LOOP
l_rec.extend; -- 必须指定,否则会报指针越界
l_rec(i) := cux_proxy_bid_award_rec(i, 100, SYSDATE, 'Y'); -- 如果是record也可以直接赋值cux_proxy_bid_award_rec,record的方式仅限于在PACKAGE中定义的TYPE,独立的TYPE只能是OBJECT
END LOOP; dbms_output.put_line(l_rec.count);
dbms_output.put_line(l_rec(3).trading_partner_id); END;

参考:

ORA-06531: 引用未初始化的收集的问题解决

java plsql 调用oracle数组类型的更多相关文章

  1. java中用spring实现数组类型输出

    java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...

  2. java代码调用oracle存储过程

    一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); ...

  3. java Hibernate 处理 oracle xmltype类型

    网上关于如何处理oracle xmltype类型的博客很多,我现在分享的是针对具体业务来的,我在oracle数据库entity表中detail插入了一条xmltype类型的数据 xml的详细内容如下: ...

  4. Java代码调用Oracle的存储过程,存储函数和包

    Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名  月薪 职位 create or ...

  5. java实现调用ORACLE中的游标和包

    今天把oracle中的包和游标学习了下,不废话,网上的的有些代码是错误的,抄来抄去,就自己实践了下,做个记录.直接上图,上代码 通过plsql创建自己的的包,包分为包头和包体. 1.包头如下: CRE ...

  6. Java 如何调用 oracle 的存储过程

    通过命令行创建存储过程 create or replace procedure emp_sal(eno emp.empno%type,esal out emp.sal%type) as begin s ...

  7. oracle 数组类型

    create or replace function my_test(p_str varchar2) return number as --普通变量 v_var ); --固定长度数组 type v_ ...

  8. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  9. java基础---->java调用oracle存储过程(转)

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...

随机推荐

  1. web前端----JavaScript的DOM(三)

    一.JS中for循环遍历测试 for循环遍历有两种 第一种:是有条件的那种,例如    for(var i = 0;i<ele.length;i++){} 第二种:for (var i in l ...

  2. (四)github之Git的初始设置

    设置姓名与邮箱地址 这里的姓名和邮箱地址会用在git的提交日志之中,在github上公开git仓库时会随着提交日志一起公开. 有两种方式, 第一种,在git bash下设置 第二种, 通过直接编辑.g ...

  3. 如何在 Linux 中将文件编码转换为 UTF-8

    一个文件:vim 文件名.txt输入 :e ++enc=gbk 强制用gbk打开输入 :w ++enc=utf8 转换到utf8保存. 多个文件:for i in *.txt; do iconv -f ...

  4. 02: python3使用email和smtplib库发送邮件

    1.1 发送qq邮箱 注:python代理登录qq邮箱发邮件,是需要更改自己qq邮箱设置的.在这里大家需要做两件事情:邮箱开启SMTP功能 .获得授权码 教程链接 1.给单个人发邮件 参考 from ...

  5. 20145331魏澍琛《网络对抗》Exp4 恶意代码分析

    20145331魏澍琛<网络对抗>Exp4 恶意代码分析 基础问题回答 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作 ...

  6. xshell的Solarized Dark配色方案

    之前在ubuntu, kali, mint, air下都使用这一款配色方案,后来在网上看到有人在xshell中使用,配色方案有分享,就是一起无法导入 原来这个东西在你现有的连接无法直接导入,需要重新打 ...

  7. P3709 大爷的字符串题

    题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...

  8. swift设计模式学习 - 模板方法模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 模板方法模式 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结 ...

  9. 2017 ACM/ICPC 新疆赛区 I 题 A Possible Tree 带权并查集

    传送门 题意:给定一棵带权树的形态, 但是并不知道每天条边的具体权重. 然后给m个信息, 信息格式为u v val, 表示在树上u 到 v 的路径上经过的边的权重的异或和为val, 问前面最多有多少个 ...

  10. 整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例

    http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/ar ...