Java处理Oracle中的用户自定义类型

Java对于PL/SQL中package下定义的类型并不支持(找不到,抛出invalid name pattern异常信息),需要定义schema级的类型。
 
Oracle的API:
 
代码如下:
Schema Level Type:
create or replace type Guy as object
(
       name varchar2(50),
       age  number
)
create or replace type GUYS as Table of GUY
PL/SQL:
create or replace package ArrayNesta is
  PROCEDURE insert_guys(
      guys_in IN guys
  );
end ArrayNesta;
create or replace package body ArrayNesta is
  PROCEDURE insert_guys(
      guys_in IN guys
  )
  IS
  BEGIN
      for i in guys_in.first .. guys_in.last
      LOOP
        insert into ASSOCIATEARRAYNESTA(name, age) values(guys_in(i).name, guys_in(i).age);
      END LOOP;
 
  END insert_guys;
 
end ArrayNesta;
Database Table:
create table ASSOCIATEARRAYNESTA(
 name varchar2(50),
 age number
)
Java:
/**
 *
 */
package array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import oracle.jdbc.pool.OracleDataSource;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
/**
 * @author nfeng
 *
 */
public class ArrayTest {
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  OracleDataSource ods = new OracleDataSource();
  ods.setURL("jdbc:oracle:thin:username/password@host:port:database");
  Connection conn = ods.getConnection();
  System.out.println(conn);
  StructDescriptor sd = StructDescriptor.createDescriptor("GUY", conn);
  Object[] nesta = new Object[] {"nesta", 29};
  STRUCT snesta = new STRUCT(sd, conn, nesta);
  
  Object[] kisey = new Object[] {"kisey", 30};  
  STRUCT skisey = new STRUCT(sd, conn, kisey);
  
  ArrayDescriptor ad = ArrayDescriptor.createDescriptor("GUYS", conn);
  ARRAY guysin = new ARRAY(ad, conn, new STRUCT[] {snesta, skisey});
  
  CallableStatement cs = conn.prepareCall("{ call ArrayNesta.insert_guys(?) }");
  cs.setArray(1, guysin);
  cs.execute();
  
  conn.close();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle自定义类型含有map、order、constructor的应用场合可以是: 1. 数据库存储复杂数据类型 在一些情况下,我们需要在Oracle数据库存储具有复杂结构的数据,例如一个包含多个字段的对象或者一个包含键值对的集合。此时,我们可以使用自定义类型来定义这些数据类型,并且在数据库进行存储和检索。 举例说明: 我们可以定义一个包含姓名、年龄和地址的人员对象: ``` CREATE TYPE person AS OBJECT ( name VARCHAR2(50), age NUMBER, address VARCHAR2(100) ); ``` 我们也可以定义一个包含多个键值对的集合对象: ``` CREATE TYPE student AS OBJECT ( scores MAP VARCHAR2(50), -- 键值对 order MEMBER FUNCTION get_score(subject VARCHAR2) RETURN NUMBER -- 获取成绩 ); ``` 2. PL/SQL的复杂数据类型 在PL/SQL,我们也可以使用自定义类型来定义复杂的数据类型,以便在程序更方便地处理数据。 举例说明: 我们可以定义一个包含多个字段的结构体类型: ``` CREATE TYPE emp_type IS OBJECT ( empno NUMBER, ename VARCHAR2(50), job VARCHAR2(50), mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER, deptno NUMBER ); ``` 我们也可以定义一个包含键值对的集合类型: ``` CREATE TYPE score_type IS TABLE OF NUMBER INDEX BY VARCHAR2(50); ``` 3. 跨平台数据传输 在不同的应用程序或系统之间进行数据传输时,可能会涉及到不同的数据类型和数据格式。此时,我们可以使用自定义类型来定义数据类型,并且在不同的平台之间进行数据传输。 举例说明: 我们可以定义一个包含姓名、年龄和地址的人员对象: ``` CREATE TYPE person_type AS OBJECT ( name VARCHAR2(50), age NUMBER, address VARCHAR2(100) ); ``` 然后,我们可以在Java程序使用JDBC来访问Oracle数据库,并且将person_type对象进行序列化和反序列化,以便在Java程序和Oracle数据库之间进行数据传输。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值