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的主要内容,如果未能解决你的问题,请参考以下文章

怎么把数据从oracle11迁到oracle12

linux 怎么查找oracle11g的安装目录

windows安装oracle76%卡了

oracle 语法

oracle 是怎么收费的?

oracle的数据怎么发送到接口