Oracle存储过程的数组参数

2012-01-19 00:00 中国IT实验室 佚名
关键字:Oracle

  ORACLE存储过程使用数组参数

  环境:Eclipse+Oracle9.0.2+Tomcat5.5

  功能:采用存储过程、type组合来实现批量入库,以节省系统开销,提高效率。

  *

  sql脚本+测试代码:

  * 1)create or replace type t_cableLine_point as object

  (

  ID NUMBER(10),

  CABLELINEID NUMBER(10),

  ROADPOINTID NUMBER(10),

  ORDERNUM NUMBER(10),

  REMARK NUMBER(10)

  )

  * 2)CREATE OR REPLACE TYPE ARRAY_cableLine_point AS table OF t_cableLine_point

  * 3)create table RSC_CABLELINE_POINT

  (

  ID NUMBER(10) not null,

  CABLELINEID NUMBER(10) not null,

  ROADPOINTID NUMBER(10) not null,

  ORDERNUM NUMBER(10),

  REMARK NUMBER(10)

  )

  * 4)create or replace procedure batch_cableline_point(i_object in ARRAY_cableLine_point) is

  begin

  insert into RSC_CABLELINE_POINT

  (ID, CABLELINEID, ROADPOINTID, ORDERNUM, REMARK)

  select ID, CABLELINEID, ROADPOINTID, ORDERNUM, REMARK

  from the (select cast(i_object as ARRAY_cableLine_point) from dual);

  end batch_cableline_point;

  * 5)测试代码:

  package com.nilpower.test;

  import java.sql.Connection;

  import java.sql.DriverManager;

  import java.sql.PreparedStatement;

  public class Test {

  public static void main(String[] args) {

  try {

  Class.forName(“oracle.jdbc.driver.OracleDriver”);

  String url = “jdbc:oracle:thin:@127.0.0.1:1521:nilpower”;

  Connection con = DriverManager.getConnection(url, “scott”, “tiger”);

  PreparedStatement pstmt = null;

  String sql = “{call batch_cableline_point(?)}”;

  pstmt = con.prepareCall(sql);

  Object[][] object1 = new Object[10][5];

  int max = 3615142;// 由于表有索引

  for (int i = 0; i 《 10; i++) {

  object1[i][0] = ++max;

  object1[i][1] = 158870593;

  object1[i][2] = 333;

  object1[i][3] = 444;

  object1[i][4] = 555;

  }

  oracle.sql.ArrayDescriptor desc = oracle.sql.ArrayDescriptor

  .createDescriptor(“ARRAY_CABLELINE_POINT”, con);

  oracle.sql.ARRAY array = new oracle.sql.ARRAY(desc, con, object1);

  pstmt.setArray(1, array);

  pstmt.executeUpdate();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  备注:如果在入库的过程中发现字符串的值没有入进去,请检查有没有加载该类库nls_charset12.jar

  * 该文章是参考“风雪”文章后个人试验的存档。

  *

  * 其他参考:(引用2008-5-24 04:49 Aowken)

  * Tomcat+Oracle调用存储过程郁闷之旅

  今天在改公司管理系统的时候,因为某个功能需要使用数组类型作为IN参数调用存储过程,看了看文档发现有Varray、nested table,但Varray有个最多数量的限制,也只好用nested table了,于是引发一连串的问题。

  环境:

  java version “1.6.0_05”

  Java(TM) SE Runtime Environment (build 1.6.0_05-b13)

  Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)

  apache-tomcat-6.0.16

  Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

  PL/SQL Release 9.2.0.1.0 - Production

  CORE 9.2.0.1.0 Production

  TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

  NLSRTL Version 9.2.0.1.0 - Production

  本来对Java这种据说很先进的东西就懵懵懂懂,索性就真的以为他非常牛X。使用几维数组作为参数调用存储过程还不是跟Set个String一样那么简单,但其实我错了,所以我也对java很失望,他远不如想象中那么XX。

  Object arrInt[] = {0,1,2,3,4,5,6};

  callStmt.SetObject(1, arrInt, Types.ARRAY);

  要是想像上面这样操作他就会抛个java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to oracle.sql.ARRAY,于是我知道java他不会自己转,非得人工干预。但我突然发现自己很愚蠢,我都没告诉他procedure参数的类型,即使可以转过去又有个P用,百度了一下才知道得用下面的法子。

  import oracle.sql.ARRAY;

  import oracle.sql.ArrayDescriptor;

  Connnection conn = DBConnManager.getConnection();

  callStmt = conn.prepareCall(sql);


比特微信账号
比特微信账号

微信扫一扫
关注Chinabyte

返回首页 长微博 返回顶部