如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程
2013-04-24 16:17
585 查看
/article/9357307.html
为了减少连接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
为了减少连接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
相关文章推荐
- 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。
- 使用Java程序一次分段读取所有数据(如海量数据)并计数处理
- 如何使用plsql导出oracle数据建表语句,存储过程,视图。以及表中数据
- 使用Java程序一次分段读取所有数据(如海量数据)并计数处理
- oracle如何使用java source调用外部程序
- 如何使用plsql导出oracle数据建表语句,存储过程,视图。以及表中数据
- 不是java的--如何使用ajax将json传入后台数据
- oracle如何使用java source调用外部程序
- 使用JDBC和Hibernate在oracle中插入和读取Blob数据的图片的java程序
- 如何在Oracle中一次执行多条sql语句
- Oracle使用虚拟表dual一次插入多条记录
- 如何让Linux下的Java程序使用中文
- Vista 下使用Visual Studio 2005 开发Oracle 方面程序出现的数据连结问题及解决方案
- 如何在dotConnect for Oracle中使用BLOB和CLOB数据
- 动态传入的逗号连接的字符串,分散成多条记录(Oracle 10g 使用REGEXP_SUBSTR 分拆字符串)
- 使用java + oracle插入clob类型的数据
- java程序中,数据验证,如何判断输入的文本框中的值是不是int型?
- 使用 Oracle的存储过程实现数据加密和解密
- 如何调用 Oracle 存储过程在 Visual Basic.NET 使用 Microsoft Oracle 托管提供程序
- 【SQL】如何一次(一条SQL语句)向ORACLE中插入多组/多条数据,不同于mysql