读书人

怎么在JAVA程序中使用Struct一次传入多

发布时间: 2013-03-26 21:10:03 作者: rapoo

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


我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html

读书人网 >其他数据库

热点推荐