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

为了减少连接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中虽然只是一次执行连接数据库,但是却一次插入两条数据。希望能够给寻找类似解决方案的兄弟姐妹提供一点帮助。有什么建议或者意见尽管留言,谢谢

猜你喜欢

转载自lzhw1985.iteye.com/blog/1830145