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,struct,blob,varray)