Oracle Summrazied
Posted slowdownthenrunfast
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Summrazied相关的知识,希望对你有一定的参考价值。
STRUCT和VARRAY
为了减少连接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 锁表
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#.
以上是关于Oracle Summrazied的主要内容,如果未能解决你的问题,请参考以下文章