java调用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: 引用未初始化的收集的问题解决

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Courier; color: #009193 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Courier; min-height: 11.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Courier }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Courier; color: #ff2600 }
span.s1 { color: #011993 }
span.s2 { color: #009193 }
span.s3 { color: #0433ff }
span.s4 { color: #ff2600 }
span.s5 { color: #000000 }

时间: 2024-07-29 19:00:23

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

Java调用Oracle存储Package

Oracle的包Package中可以有很多存储,可通过该包的总调入口在java中直接调用. //java调用oracle的package代码 public boolean cal() throws java.lang.Exception { CallableStatement cstmt = null; String procedure = "{call G_IMPORT_CAL.g_entry(?,?,?) }"; cstmt = conn.prepareCall(procedure

oracle 数组类型

create or replace function my_test(p_str varchar2) return number as --普通变量 v_var varchar2(1000); --固定长度数组 type v_ar is varray(10) of varchar2(30); my_ar v_ar:=v_ar('g','m','d','龚','帅'); --可变长度数值 type type_array is table of varchar2(20) index by binar

Oracle数组类型

Oracle数组类型 Oracle的数组类型,范例: Sql代码 create or replace function my_test(p_str varchar2) return number as --普通变量 v_var varchar2(1000); --固定长度数组 type v_ar is varray(10) of varchar2(30); my_ar v_ar:=v_ar('g','m','d','龚','帅'); --可变长度数值 type type_array is tab

java基础----&gt;java调用oracle存储过程(转)

存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天,我们就开始学习java中调用oracle的存储过程. java中调用oracle的存储过程 项目结构如下: 一. 在数据库创建存储过程的脚本,如果使用的是本地的oracle数据库,则需要开启服务:OracleOraDb11g_home1TNSListener和OracleServiceORCL.

java基础----&gt;java调用oracle存储过程

存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天,我们就开始学习java中调用oracle的存储过程. java中调用oracle的存储过程 项目结构如下: 一. 在数据库创建存储过程的脚本,如果使用的是本地的oracle数据库,则需要开启服务:OracleOraDb11g_home1TNSListener和OracleServiceORCL.

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

java 调用 oracle 存储过程

-- 编写过程,要求输入雇员编号,返回雇员姓名. create or replace procedure getNameByNo(no in number, name out varchar2) is begin select ename into name from emp where empno = no; end; -- 输入部门号,返回该部门所有员工 -- 先建一个包,定义一个游标类型 create or replace package pkg_cursor is type my_cur

Java中已经数组类型,为什么还要提供集合?

数组的优点: 数组的效率高于集合类 数组能存放基本数据类型和对象:集合中只能放对象 数组的缺点: 不是面向对象的,存在明显的缺陷 数组长度固定且无法动态改变:集合类容量动态改变 数组无法判断其中实际存了多少元素,只能通过length属性获取数组的申明的长度 数组存储的特点是顺序的连续内存:集合的数据结构更丰富 JDK 提供集合的意义: 集合以类的形式存在,符合面向对象,通过简单的方法和属性调用可实现各种复杂操作 集合有多种数据结构,不同类型的集合可适用于不同场合 弥补了数组的一些缺点,比数组更灵

Java 调用Oracle中的存储过程

--建表 SQL> create table TBook(bookId number(8),bookName varchar2(50),publishHouse varchar2(50)); --编写过程 --in:输入参数:out:输出参数 SQL> create or replace procedure sp_pro7(spBookId in number,spName in Varchar2,spPublishHost in varchar2) is begin insert into