为了减少连接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