如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程

146 篇文章 0 订阅

http://blog.csdn.net/dutguoyi/article/details/1879416

为了减少连接Oracle数据库的数量,需要将多条数据作为变量一次传入Oracle的存储过程中。方法如下:

步骤一:定义对象类型。 

CREATE TYPE department_type AS  OBJECT (
DNO 
NUMBER (10
),
NAME 
VARCHAR2 (50
),
LOCATION 
VARCHAR2 (50
)
);

步骤二:定义一个对象类型的数组对象。

CREATE TYPE dept_array AS TABLE OF department_type;

步骤三:定义存储过程来插入数据。

CREATE OR REPLACE PACKAGE objecttype AS
  
PROCEDURE  insert_object (d dept_array);
END
 objecttype;

CREATE OR REPLACE
 PACKAGE BODY objecttype
AS

PROCEDURE  insert_object (d dept_array)
AS

BEGIN
FOR i IN  d.FIRST..d.LAST
LOOP
INSERT INTO
 department_teststruct
VALUES
 (d(i).dno,d(i).name,d(i).location);
END
 LOOP;
END
 insert_object; 
END
 objecttype;

步骤四(可选步骤,即可以不做):定义一个Java class来映射对象中类型。
步骤五:定义Java方法来调用存储过程。 

import  java.sql.Connection; 
import
 java.sql.DriverManager;
import
 oracle.jdbc.OracleCallableStatement;
import
 oracle.sql.ARRAY;
import
 oracle.sql.ArrayDescriptor;
import
 oracle.sql.STRUCT;
import
 oracle.sql.StructDescriptor;

public class TestStruct ...
{
    
public static void
 main(String[] args)
    
...
{
            sendStruct();
    }

    
public static void sendStruct() 
    
...
{
        Connection dbConn 
= null
;
        
try...
{    
            Object[] so1 
= ...{"10","Accounts","LHR"}

            Object[] so2 
= ...{"20","HR","ISB"}

            OracleCallableStatement callStatement 
= null

            Class.forName(
"oracle.jdbc.driver.OracleDriver"
);
            dbConn 
= DriverManager.getConnection("jdbc:oracle:thin:@ServerName:Port:ORa""UserName""Password"
);
            StructDescriptor st 
= new StructDescriptor("DEPARTMENT_TYPE"
,dbConn);
            STRUCT s1 
= new
 STRUCT(st,dbConn,so1);
            STRUCT s2 
= new
 STRUCT(st,dbConn,so2);
            STRUCT[] deptArray 
= ...{s1,s2}
;
            ArrayDescriptor arrayDept 
= ArrayDescriptor.createDescriptor("DEPT_ARRAY"
, dbConn);
            ARRAY deptArrayObject 
= new
 ARRAY(arrayDept, dbConn, deptArray); 
            callStatement 
= (OracleCallableStatement)dbConn.prepareCall("{call insert_object(?)}"
);
            ((OracleCallableStatement)callStatement).setArray(
1
, deptArrayObject);
            callStatement.executeUpdate(); 
            dbConn.commit();
            callStatement.close(); 
        }
 
        
catch(Exception e)...

            System.out.println(e.toString());
        }

    }

}

jdbc:oracle:thin:            --Oracle数据库驱动标识

ServerName:                 --Oracle数据库所有机器名或IP地址

1521:                           --数据库所使用的端口号

ORa                             --Oracle服务名   
 

注意事项:

1. 首先一个操作是手动连接Oracle建立对象,接下来的操作是通过JAVA程序建立数据库连接来使用对象。如果两个操作使用同一个用户就没有问题,如果是不同的用户那么要确保第二个操作(即通过Java程序)的用户有权限来操作第一个用户建立的对象。第一个用户为它添加权限的方法是:在每个对象中大家可以找到权限一项,找到对应用户添加执行权限即可。而在程序中就需要做一些修改。存储过程同理。
   StructDescriptor st = new StructDescriptor("第一个UserName.DEPARTMENT_TYPE",dbConn);
      ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("第一个UserName.DEPT_ARRAY", dbConn);
      callStatement = (OracleCallableStatement)dbConn.prepareCall("{call 第一个UserName.insert_object(?)}");

结果是Java中虽然只是一次执行连接数据库,但是却一次插入两条数据。希望能够给寻找类似解决方案的兄弟姐妹提供一点帮助。有什么建议或者意见尽管留言,谢谢。

参考资料:

1. 大家可以在下面的链接中找到javadoc文件来进行下载,这是一个非常有用的说明文档,这次我主要用到了DriverManager.getConnection的定义方法。

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101020.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值