STRUCT和VARRAY
步骤五:定义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()); } } }
注意事项:
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数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?
(1)锁表查询的代码有以下的形式:
select count(*) from v$locked_object;select * from v$locked_object;
(2)查看哪个表被锁
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)杀掉对应进程执行命令:
alter system kill session'1025,41';
其中1025为sid,41为serial#.