java plsql 调用oracle数组类型
首先当然是在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数组类型的更多相关文章
- java中用spring实现数组类型输出
java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...
- java代码调用oracle存储过程
一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); ...
- java Hibernate 处理 oracle xmltype类型
网上关于如何处理oracle xmltype类型的博客很多,我现在分享的是针对具体业务来的,我在oracle数据库entity表中detail插入了一条xmltype类型的数据 xml的详细内容如下: ...
- Java代码调用Oracle的存储过程,存储函数和包
Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名 月薪 职位 create or ...
- java实现调用ORACLE中的游标和包
今天把oracle中的包和游标学习了下,不废话,网上的的有些代码是错误的,抄来抄去,就自己实践了下,做个记录.直接上图,上代码 通过plsql创建自己的的包,包分为包头和包体. 1.包头如下: CRE ...
- Java 如何调用 oracle 的存储过程
通过命令行创建存储过程 create or replace procedure emp_sal(eno emp.empno%type,esal out emp.sal%type) as begin s ...
- oracle 数组类型
create or replace function my_test(p_str varchar2) return number as --普通变量 v_var ); --固定长度数组 type v_ ...
- Java BasicNameValuePair怎么传数组类型的参数?
BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);
- java基础---->java调用oracle存储过程(转)
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...
随机推荐
- MySQL数据库----事务处理
事物处理 一. 什么是事务 一组sql语句批量执行,要么全部执行成功,要么全部执行失败 二.为什么出现这种技术 为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一 ...
- VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例
转载:http://www.codefans.net/articles/1435.shtml 转载:http://www.cnblogs.com/morewindows/archive/2011/08 ...
- 【前端】javascript实现带有子菜单和控件的轮播图slider
实现效果: 实现原理: // 步骤 // 1. 获取事件源以及相关元素 // 2. 复制第一张图片所在的li,添加到ul的最后面 // 3. 给ol添加li,ul中的个数-1个,并点亮第一个按钮 // ...
- Python3基础 str format 位置参数与关键字参数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- ExtJS使用入门
extjs是基于 yui 由 jack slocum开发, sencha是他们的公司, sencha是由三个项目合并起来的开源项目: ExtJS, jqTouch, Raphael(拉斐尔, 圣经中的 ...
- Https流程,openssl本地自建证书,抓包
HTTPS:超文本安全传输协议,和HTTP相比,多了一个SSL/TSL的认证过程,端口为443在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http ...
- jQuery ajax 添加头部参数跨域
1.添加HTTP文件头 $.ajax({ url: "http://www.baidu.com", //contentType: "text/html; charset= ...
- HDU 4135 Co-prime(容斥:二进制解法)题解
题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...
- 05_Kafka Python_Consumer模拟
Python客户端: Kafka-python 安装: pip install kafka-python Consumer端模拟代码 """ Kafka Consum ...
- UVa 242 邮票和信封(完全背包)
https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...