您的位置:首页 > 数据库 > Oracle

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

2007-11-11 22:30 1411 查看
为了减少连接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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: