首先当然是在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. 【运维技术】Nexus私服安装配置常用问题

    maven私服安装配置 软件安装及基本配置 安装配置 # 安装jdk,参考其他教程 mkdir -p /app/nexus2 # 创建目录 wget https://download.sonatype ...

  2. INNODB引擎概述

    INNODB存储引擎的历史概述: INNODB存储引擎是OLTP应用中核心表的首选存储引擎. INNODB存储引擎包含在所有mysql数据库的二进制发行版本中.早期其版本随着mysql数据库的更新而更 ...

  3. linux 挂载硬盘 + 对硬盘 分区

    parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区 fdisk命令对于大于2T的分区无法划分,所以用fdisk无法看到parted划分的GPT格式的分区 1. 用 ...

  4. dba和运维专家们说有丰富的大型分布式系统架构设计经验纯属扯淡

    如果,一开始就从事dba和运维的专家们说他们有丰富的大型分布式系统架构设计经验,那纯属扯淡.除非,他们从是从开发专家或者架构师转型而来,那么他们才有资格说自己有丰富的大型分布式系统架构设计经验. 运维 ...

  5. POJ 1260 Pearls (斜率DP)题解

    思路: 直接DP也能做,这里用斜率DP. dp[i] = min{ dp[j] + ( sum[i] - sum[j] + 10 )*pr[i]} ; k<j<i  =>  dp[j ...

  6. java web项目启动进入首页的配置方式(包含过滤跳转首页实现)

    本文为博主原创,未经允许不得转载: 项目启动成功,进入首页的方式,我们往往在web.xml 中通过以下的方式默认进入跳转首页, <welcome-file-list> <welcom ...

  7. 【Coursera】SecondWeek(2)

    The First Two Packets on the Internet Leonard Kleinrock Kleinrock 是一名工程师和计算机科学家,他在APRANET网络中起到了至关重要的 ...

  8. 04_Windows平台Spark开发环境构建

    Spark的开发环境,可以基于IDEA+Scala插件,最终将打包得到的jar文件放入Linux服务器上的Spark上运行 如果是Python的小伙伴,可以在Windows上部署spark+hadoo ...

  9. Java中的this

    首先this作为关键字其实是随着对象的创建而产生的,当我们调用对象的一个方法的时候: 例如: A a = new A(); a.f(1)  其实我们可以理解为a.f(a,1) 编译器默默的把所操作的对 ...

  10. Hadoop 部分截图