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查询操作1
##1.在已有的表中插入一行记录 insert into tb_name values("",""...); ##2.查询语句的框架和用法 select 字段名 ...
- pyDay1
1.import python中的import语句是用来导入模块的. 在python的模块库中有大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中, 使用方法例如: ...
- Poisson Blending(Seamless clone)研究和实现
Poisson Blending 实现了非常棒的效果,可以看 <自己动手,实现“你的名字”滤镜> http://www.cnblogs.com/jsxyhelu/p/7216795.htm ...
- JAVA第十周《网络编程》学习内容总结
JAVA第十周<网络编程>学习内容总结 学习内容总结 1.初听到网络编程四个字可能会觉得很困难,实际上网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据,把数据发送到指定的位置, ...
- 20145336 张子扬 《网络对抗技术》web基础
20145336张子扬<网络对抗>Exp8 Web基础 实践内容 1.简单的web前端页面(HTML.CSS等) 2.简单的web后台数据处理(PHP) 3.Mysql数据库 4.一个简单 ...
- React 回忆录(三)使用 React 渲染界面
Hi 各位,欢迎来到 React 回忆录!
- C# 将 Stream 写入文件
public void StreamToFile(Stream stream,string fileName) { // 把 Stream 转换成 byte[] byte[] bytes = new ...
- Python3基础 help 查看内置函数说明
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Go第二篇之基本语法总结
Go语言标识符 标识符以字母或下划线开头,大小写敏感 _是特殊标识符,用来忽略结果 Go语言变量的声明 变量(Variable)的功能是存储用户的数据.不同的逻辑有不同的对象类型,也就有不同的变量类型 ...
- Adobe Reader 2019 Offline Installer, Free Download - Best PDF Reader
https://ridnt-b.blogspot.com/2018/01/adobe-reader-2018-free-download.html http://ardownload.adobe.co ...