少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #

          第一部分:關于delete的觸發(fā)器執(zhí)行
          CREATE TABLE `abin5` (
            `id` int(11) DEFAULT NULL,
            `name5` varchar(39) DEFAULT NULL
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

          create table abin6 like abin5; 

          建立觸發(fā)器:

          CREATE TRIGGER `tabin1` BEFORE DELETE ON `abin5` FOR EACH ROW begin
           declare id int default 0;
           declare name varchar(100) default null;
           set id=OLD.id;
           set name=OLD.name5;
           insert into abin6 values (id,name);
          end;

          測試語句:
          delete from abin5 where id='1';
          然后查看abin6表里面,必定是新增了一條和abin5表里面刪除掉的一模一樣的記錄。





          第一部分:關于insert的觸發(fā)器執(zhí)行
          建表:
          create table abing(
          id int not null auto_increment,
          name varchar(100),
          constraint pk primary key(id)
          )

          建立觸發(fā)器:(用于主鍵自增)
          create trigger tabing before insert on abing for each row
          begin
           set @id=new.id;
          end

          執(zhí)行insert語句:
          insert into abing (name) values ('abing');

          查看結(jié)果:
          select * from abing

          呵呵,結(jié)果是自然主鍵自增了。





          第一部分:關于update的觸發(fā)器執(zhí)行
          建表:
          create table abing(
          id int not null auto_increment,
          name varchar(100),
          sid int,
          constraint pk primary key(id)
          )

          建立觸發(fā)器:
          create trigger tabing before update on abing for each row
          begin
           set @old=old.sid;
           set @new=new.sid;
          end





          參考資料:http://database.51cto.com/art/201010/229404.htm

          posted @ 2012-09-16 18:50 abin 閱讀(437) | 評論 (0)編輯 收藏

          1、建立存儲過程
          create procedure pabin4()
          BEGIN
          declare status,id int;
          declare az,ax varchar(100) default '';
          declare mycur cursor for select * from abin5;
          declare continue handler for not found set status=1;
          open mycur;
           set status=0;
           loopLabel:LOOP

            fetch mycur into id,az;

            if status = 0 then
             if az is not null then
              set ax=CONCAT(az,'mycur');
             else
              set ax=CONCAT('mysql','mycur');
             end if;
             insert into abin5 values (id,ax);
            end if;

            if status = 1 then
             leave loopLabel;
            end if;

            end loop;
          close mycur;
          END

           

           

           2、測試語句

          call pabin4()
           

          posted @ 2012-09-16 03:16 abin 閱讀(491) | 評論 (0)編輯 收藏

          在MySQL存儲過程的語句中有三個標準的循環(huán)方式:WHILE循環(huán),LOOP循環(huán)以及REPEAT循環(huán)。還有一種非標準的循環(huán)方式:GOTO,不過這種循環(huán)方式最好別用,很容易引起程序的混亂,在這里就不錯具體介紹了。

          這幾個循環(huán)語句的格式如下:
          WHILE……DO……END WHILE
          REPEAT……UNTIL END REPEAT
          LOOP……END LOOP
          GOTO。

          1、建立存儲過程
          create procedure pabin2()
          BEGIN
          declare i int ;
          set i=0;
          while i<5 do
           insert into abin5 values (i,CONCAT('while',i));
           set i=i+1;
          end while;
          END
          測試語句:
          call pabin2()


          2、建立存儲過程:
          create procedure pabin3()
          BEGIN
          declare i int ;
          declare az varchar(100) default '';
          set i=0;
          repeat
           set az=CONCAT('repeat',i);
           insert into abin5 values (i,az);
           set i=i+1;
           until i>=5
          end repeat;
          end

          測試語句:
          call pabin3()


          3、建立存儲過程:
          create procedure pabin1()
          begin
          declare i int default 0;
          declare av varchar(100) default '';
          loop_label:LOOP
           if i=3 then
            set i=i+1;
            iterate loop_label;
           end if;
           set av=CONCAT('loop',i);
           insert into abin5 values (i,av);
           set i=i+1;
           if i>=5 then
            leave loop_label;
           end if;
          end loop;
          end;



          測試語句:
          call pabin1()
          posted @ 2012-09-16 02:30 abin 閱讀(504) | 評論 (0)編輯 收藏

          開發(fā)環(huán)境:Navicat For Mysql
          第一個例子,(輸出參數(shù))返回值的存儲過程:
          1、建表
          create table abin5(
          id int,
          name5 VARCHAR(39)
          )
          2、創(chuàng)建存儲過程
          create procedure pabin5(out n int)
          BEGIN
           select count(*) from abin5;
          END
          3、測試存儲過程
          call pabin5(@n)

          第二個例子,帶輸入?yún)?shù)的存儲過程:
          1、建立存儲過程
          create procedure pabin6(in n int)
          BEGIN
           SELECT * FROM abin5 where id=n;
          END
          2、測試存儲過程
          SET @n=1;
          CALL pabin6(@n)


          posted @ 2012-09-16 02:00 abin 閱讀(5406) | 評論 (2)編輯 收藏

               摘要: oracle的函數(shù)很多﹐特整理出來﹕ abs(m)  m的絕對值mod(m,n) m被n除后的余數(shù)power(m,n) m的n次方round(m[,n]) m四舍五入至小數(shù)點后n位的值(n缺省為0)trunc(m[,n]) m截斷n位小數(shù)位的值(n缺省為0) 字符函數(shù): initcap(st) 返回st將每個單詞的首字母大...  閱讀全文
          posted @ 2012-09-14 14:21 abin 閱讀(472) | 評論 (0)編輯 收藏

          -- Create table
          create table ABIN1
          (
            ID1         NUMBER,
            NAME1       NVARCHAR2(100),
            CREATETIME1 DATE default sysdate
          )



          create or replace function getFunction(myname varchar2)
          return sys_refcursor
          as

          v_sql varchar2(4000);
          mylist sys_refcursor;
          begin
                 v_sql:='select * from abin1 where name1=:1';
                 open myList for v_sql using myname;
                 return(myList);
          end;



          package com.abin.lee.db.oracle;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.SQLException;

          public class OracleConnection {
           private static final String USER="abin";
           private static final String PWD="abin";
           private static final String URL="jdbc:oracle:thin:@localhost:1521:XE";
           private static final String DRIVER="oracle.jdbc.driver.OracleDriver";
           private static ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>(){
            protected Connection initialValue(){
             Connection conn=null;
             try {
              Class.forName(DRIVER);
              if(null==conn||conn.isClosed()){
               conn=DriverManager.getConnection(URL, USER, PWD);
              }
             } catch (Exception e) {
              e.printStackTrace();
             }
             return conn;
            }
            
           };
           
           
           public static Connection getConnection() throws ClassNotFoundException, SQLException{
            Connection conn=null;
            if(threadLocal.get()==null){
             Class.forName(DRIVER);
             conn=DriverManager.getConnection(URL, USER, PWD);
             threadLocal.set(conn);
            }else {
             return threadLocal.get();
            }
            return conn;
           }

          }




          package com.abin.lee.db.oracle;

          import java.sql.CallableStatement;
          import java.sql.Connection;
          import java.sql.ResultSet;

          import junit.framework.TestCase;
          import oracle.jdbc.OracleTypes;

          public class GetFunctionResultSet extends TestCase{
           public void test(){
            Connection conn=null;
            CallableStatement cs=null;
            ResultSet rs=null;
            try {
             conn=OracleConnection.getConnection();
           /*此處是關鍵,不要寫錯了。第一個問號代表返回值,getFunction()括號里面是function的輸入?yún)?shù)。*/  
             cs=conn.prepareCall("{?=call getFunction(?)}");
             cs.registerOutParameter(1, OracleTypes.CURSOR);
             cs.setString(2, "a1");
             cs.execute();
             rs=(ResultSet)cs.getObject(1);
             while(rs.next()&&rs!=null){
              System.out.println("ID="+rs.getInt("id1"));
              System.out.println("NAME="+rs.getString("name1"));
              System.out.println("NAME="+rs.getString("createtime1"));
             }
             
            } catch (Exception e) {
             e.printStackTrace();
            }
            /**
             * create or replace function getFunction(myname varchar2)
             return sys_refcursor
             as
             v_sql varchar2(4000);
             mylist sys_refcursor;
             begin
                    v_sql:='select * from abin1 where name1=:1';
                    open myList for v_sql using myname;
                    return(myList);
             end;
             */
            
           }
          }




          參考資料:
          http://lanselixiangxc.bokee.com/267623.html

          posted @ 2012-09-14 12:46 abin 閱讀(576) | 評論 (0)編輯 收藏

          -- Create table
          create table ABIN1
          (
            ID1         NUMBER,
            NAME1       NVARCHAR2(100),
            CREATETIME1 DATE default sysdate
          )

          create or replace procedure getList(myname varchar2,mylist out sys_refcursor)
          is
          v_sql varchar2(4000);
          begin
                v_sql:='select * from abin1 where name1=:1';
                 open myList for v_sql using myname;
          end;




          package com.abin.lee.db.oracle;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.SQLException;

          public class OracleConnection {
           private static final String USER="abin";
           private static final String PWD="abin";
           private static final String URL="jdbc:oracle:thin:@localhost:1521:XE";
           private static final String DRIVER="oracle.jdbc.driver.OracleDriver";
           private static ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>(){
            protected Connection initialValue(){
             Connection conn=null;
             try {
              Class.forName(DRIVER);
              if(null==conn||conn.isClosed()){
               conn=DriverManager.getConnection(URL, USER, PWD);
              }
             } catch (Exception e) {
              e.printStackTrace();
             }
             return conn;
            }
            
           };
           
           
           public static Connection getConnection() throws ClassNotFoundException, SQLException{
            Connection conn=null;
            if(threadLocal.get()==null){
             Class.forName(DRIVER);
             conn=DriverManager.getConnection(URL, USER, PWD);
             threadLocal.set(conn);
            }else {
             return threadLocal.get();
            }
            return conn;
           }

          }






          package com.abin.lee.db.oracle;

          import java.sql.CallableStatement;
          import java.sql.Connection;
          import java.sql.ResultSet;

          import junit.framework.TestCase;
          import oracle.jdbc.OracleTypes;

          public class GetProcedureResultSet extends TestCase{
           public void test(){
            Connection conn=null;
            CallableStatement cs=null;
            ResultSet rs=null;
            try {
             conn=OracleConnection.getConnection();
             cs=conn.prepareCall("{call getList(?,?)}");
             cs.setString(1, "a1");
             cs.registerOutParameter(2, OracleTypes.CURSOR);
             cs.execute();
             rs=(ResultSet)cs.getObject(2);
             while(rs.next()&&rs!=null){
              System.out.println("ID="+rs.getInt("id1"));
              System.out.println("NAME="+rs.getString("name1"));
              System.out.println("NAME="+rs.getString("createtime1"));
             }
             
            } catch (Exception e) {
             e.printStackTrace();
            }
            
            
           }
           /**
            * create or replace procedure getList(myname varchar2,mylist out sys_refcursor)
            is
            v_sql varchar2(4000);
            begin
                  v_sql:='select * from abin1 where name1=:1';
                   open myList for v_sql using myname;
            end;
            */
          }


          posted @ 2012-09-14 12:42 abin 閱讀(1568) | 評論 (0)編輯 收藏

          此文從以下幾個方面來整理關于分區(qū)表的概念及操作:
                  1.表空間及分區(qū)表的概念
                  2.表分區(qū)的具體作用
                  3.表分區(qū)的優(yōu)缺點
                  4.表分區(qū)的幾種類型及操作方法
                  5.對表分區(qū)的維護性操作.
          (1.) 表空間及分區(qū)表的概念
          表空間:
            是一個或多個數(shù)據(jù)文件的集合,所有的數(shù)據(jù)對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。
           
          分區(qū)表:
          當表中的數(shù)據(jù)量不斷增大,查詢數(shù)據(jù)的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區(qū)。表進行分區(qū)后,邏輯上表仍然是一張完整的表,只是將表中的數(shù)據(jù)在物理上存放到多個表空間(物理文件上),這樣查詢數(shù)據(jù)時,不至于每次都掃描整張表。
           
          ( 2).表分區(qū)的具體作用
          Oracle的表分區(qū)功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區(qū)可以使某些查詢以及維護操作的性能大大提高。此外,分區(qū)還可以極大簡化常見的管理任務,分區(qū)是構(gòu)建千兆字節(jié)數(shù)據(jù)系統(tǒng)或超高可用性系統(tǒng)的關鍵工具。
           
          分區(qū)功能能夠?qū)⒈?、索引或索引組織表進一步細分為段,這些數(shù)據(jù)庫對象的段叫做分區(qū)。每個分區(qū)有自己的名稱,還可以選擇自己的存儲特性。從數(shù)據(jù)庫管理員的角度來看,一個分區(qū)后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數(shù)據(jù)庫管理員在管理分區(qū)后的對象時有相當大的靈活性。但是,從應用程序的角度來看,分區(qū)后的表與非分區(qū)表完全相同,使用 SQL DML 命令訪問分區(qū)后的表時,無需任何修改。
           
          什么時候使用分區(qū)表:
          1、表的大小超過2GB。
          2、表中包含歷史數(shù)據(jù),新的數(shù)據(jù)被增加都新的分區(qū)中。
           
           (3).表分區(qū)的優(yōu)缺點
          表分區(qū)有以下優(yōu)點:
          1、改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關心的分區(qū),提高檢索速度。
          2、增強可用性:如果表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;
          3、維護方便:如果表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可;
          4、均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能。
           
          缺點:
          分區(qū)表相關:已經(jīng)存在的表沒有方法可以直接轉(zhuǎn)化為分區(qū)表。不過 Oracle 提供了在線重定義表的功能。
           
          (4).表分區(qū)的幾種類型及操作方法
           一.范圍分區(qū):
          范圍分區(qū)將數(shù)據(jù)基于范圍映射到每一個分區(qū),這個范圍是你在創(chuàng)建分區(qū)時指定的分區(qū)鍵決定的。這種分區(qū)方式是最為常用的,并且分區(qū)鍵經(jīng)常采用日期。舉個例子:你可能會將銷售數(shù)據(jù)按照月份進行分區(qū)。
          當使用范圍分區(qū)時,請考慮以下幾個規(guī)則:
          1、每一個分區(qū)都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區(qū)中的上限值。分區(qū)鍵的任何值等于或者大于這個上限值的記錄都會被加入到下一個高一些的分區(qū)中。
          2、所有分區(qū),除了第一個,都會有一個隱式的下限值,這個值就是此分區(qū)的前一個分區(qū)的上限值。
          3、在最高的分區(qū)中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高于其它分區(qū)中的任何分區(qū)鍵的值,也可以理解為高于任何分區(qū)中指定的VALUE LESS THEN的值,同時包括空值。
          例一:
          假設有一個CUSTOMER表,表中有數(shù)據(jù)200000行,我們將此表通過CUSTOMER_ID進行分區(qū),每個分區(qū)存儲100000行,我們將每個分區(qū)保存到單獨的表空間中,這樣數(shù)據(jù)文件就可以跨越多個物理磁盤。下面是創(chuàng)建表和分區(qū)的代碼,如下:
          CREATE TABLE CUSTOMER
          (
              CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
              FIRST_NAME  VARCHAR2(30) NOT NULL,
              LAST_NAME   VARCHAR2(30) NOT NULL,
              PHONE        VARCHAR2(15) NOT NULL,
              EMAIL        VARCHAR2(80),
              STATUS       CHAR(1)
          )
          PARTITION BY RANGE (CUSTOMER_ID)
          (
              PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
              PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
          )
          例二:按時間劃分
          CREATE TABLE ORDER_ACTIVITIES
          (
              ORDER_ID      NUMBER(7) NOT NULL,
              ORDER_DATE    DATE,
              TOTAL_AMOUNT NUMBER,
              CUSTOTMER_ID NUMBER(7),
              PAID           CHAR(1)
          )
          PARTITION BY RANGE (ORDER_DATE)
          (
            PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,
            PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
            PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
          )
          例三:MAXVALUE
          CREATE TABLE RangeTable
          (
            idd   INT PRIMARY KEY ,
            iNAME VARCHAR(10),
            grade INT 
          )
          PARTITION  BY  RANGE (grade)
          (
                PARTITION  part1 VALUES  LESS  THEN (1000) TABLESPACE  Part1_tb,
                PARTITION  part2 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  Part2_tb
          );
           
          二.列表分區(qū):
          該分區(qū)的特點是某列的值只有幾個,基于這樣的特點我們可以采用列表分區(qū)。
          例一
          CREATE TABLE PROBLEM_TICKETS
          (
              PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,
              DESCRIPTION  VARCHAR2(2000),
              CUSTOMER_ID  NUMBER(7) NOT NULL,
              DATE_ENTERED DATE NOT NULL,
              STATUS       VARCHAR2(20)
          )
          PARTITION BY LIST (STATUS)
          (
                PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,
                PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
          例二
          CREATE  TABLE  ListTable
          (
              id    INT  PRIMARY  KEY ,
              name  VARCHAR (20),
              area  VARCHAR (10)
          )
          PARTITION  BY  LIST (area)
          (
              PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,
              PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb
          );
          )
           
          三.散列分區(qū):
          這類分區(qū)是在列值上使用散列算法,以確定將行放入哪個分區(qū)中。當列的值沒有合適的條件時,建議使用散列分區(qū)。
          散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使得這些分區(qū)大小一致。
          例一:
          CREATE TABLE HASH_TABLE
          (
            COL NUMBER(8),
            INF VARCHAR2(100)
          )
          PARTITION BY HASH (COL)
          (
            PARTITION PART01 TABLESPACE HASH_TS01,
            PARTITION PART02 TABLESPACE HASH_TS02,
            PARTITION PART03 TABLESPACE HASH_TS03
          )
          簡寫:
          CREATE TABLE emp
          (
              empno NUMBER (4),
              ename VARCHAR2 (30),
              sal   NUMBER
          )
          PARTITION BY  HASH (empno) PARTITIONS 8
          STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
           
          hash分區(qū)最主要的機制是根據(jù)hash算法來計算具體某條紀錄應該插入到哪個分區(qū)中,hash算法中最重要的是hash函數(shù),Oracle中如果你要使用hash分區(qū),只需指定分區(qū)的數(shù)量即可。建議分區(qū)的數(shù)量采用2的n次方,這樣可以使得各個分區(qū)間數(shù)據(jù)分布更加均勻。
           
          四.組合范圍散列分區(qū)
          這種分區(qū)是基于范圍分區(qū)和列表分區(qū),表首先按某列進行范圍分區(qū),然后再按某列進行列表分區(qū),分區(qū)之中的分區(qū)被稱為子分區(qū)。
          CREATE TABLE SALES
          (
          PRODUCT_ID VARCHAR2(5),
          SALES_DATE DATE,
          SALES_COST NUMBER(10),
          STATUS VARCHAR2(20)
          )
          PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
          (
             PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
                    (
                        SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                        SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
                    ),
             PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
                    (
                        SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                        SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
                    )
          )
           
          五.復合范圍散列分區(qū):
          這種分區(qū)是基于范圍分區(qū)和散列分區(qū),表首先按某列進行范圍分區(qū),然后再按某列進行散列分區(qū)。
          create table dinya_test
           (
           transaction_id number primary key,
           item_id number(8) not null,
           item_description varchar2(300),
           transaction_date date
           )
           partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
           (
               partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
               partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
               partition part_03 values less than(maxvalue)
           );
           
          (5).有關表分區(qū)的一些維護性操作:
          一、添加分區(qū)
          以下代碼給SALES表添加了一個P3分區(qū)
          ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
          注意:以上添加的分區(qū)界限應該高于最后一個分區(qū)界限。
          以下代碼給SALES表的P3分區(qū)添加了一個P3SUB1子分區(qū)
          ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
          二、刪除分區(qū)
          以下代碼刪除了P3表分區(qū):
          ALTER TABLE SALES DROP PARTITION P3;
          在以下代碼刪除了P4SUB1子分區(qū):
          ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
          注意:如果刪除的分區(qū)是表中唯一的分區(qū),那么此分區(qū)將不能被刪除,要想刪除此分區(qū),必須刪除表。
          三、截斷分區(qū)
          截斷某個分區(qū)是指刪除某個分區(qū)中的數(shù)據(jù),并不會刪除分區(qū),也不會刪除其它分區(qū)中的數(shù)據(jù)。當表中即使只有一個分區(qū)時,也可以截斷該分區(qū)。通過以下代碼截斷分區(qū):
          ALTER TABLE SALES TRUNCATE PARTITION P2;
          通過以下代碼截斷子分區(qū):
          ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
          四、合并分區(qū)
          合并分區(qū)是將相鄰的分區(qū)合并成一個分區(qū),結(jié)果分區(qū)將采用較高分區(qū)的界限,值得注意的是,不能將分區(qū)合并到界限較低的分區(qū)。以下代碼實現(xiàn)了P1 P2分區(qū)的合并:
          ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
          五、拆分分區(qū)
          拆分分區(qū)將一個分區(qū)拆分兩個新分區(qū),拆分后原來分區(qū)不再存在。注意不能對HASH類型的分區(qū)進行拆分。
          ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
          六、接合分區(qū)(coalesca)
          結(jié)合分區(qū)是將散列分區(qū)中的數(shù)據(jù)接合到其它分區(qū)中,當散列分區(qū)中的數(shù)據(jù)比較大時,可以增加散列分區(qū),然后進行接合,值得注意的是,接合分區(qū)只能用于散列分區(qū)中。通過以下代碼進行接合分區(qū):
          ALTER TABLE SALES COALESCA PARTITION;
          七、重命名表分區(qū)
          以下代碼將P21更改為P2
          ALTER TABLE SALES RENAME PARTITION P21 TO P2;
          八、相關查詢
          跨分區(qū)查詢
          select sum( *) from
          (select count(*) cn from t_table_SS PARTITION (P200709_1)
          union all
          select count(*) cn from t_table_SS PARTITION (P200709_2)
          );
          查詢表上有多少分區(qū)
          SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
          查詢索引信息
          select object_name,object_type,tablespace_name,sum(value)
          from v$segment_statistics
          where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
          group by object_name,object_type,tablespace_name
          order by 4 desc
           
          --顯示數(shù)據(jù)庫所有分區(qū)表的信息:
          select * from DBA_PART_TABLES
           
          --顯示當前用戶可訪問的所有分區(qū)表信息:
          select * from ALL_PART_TABLES
           
          --顯示當前用戶所有分區(qū)表的信息:
          select * from USER_PART_TABLES
           
          --顯示表分區(qū)信息 顯示數(shù)據(jù)庫所有分區(qū)表的詳細分區(qū)信息:
          select * from DBA_TAB_PARTITIONS
           
          --顯示當前用戶可訪問的所有分區(qū)表的詳細分區(qū)信息:
          select * from ALL_TAB_PARTITIONS
           
          --顯示當前用戶所有分區(qū)表的詳細分區(qū)信息:
          select * from USER_TAB_PARTITIONS
           
          --顯示子分區(qū)信息 顯示數(shù)據(jù)庫所有組合分區(qū)表的子分區(qū)信息:
          select * from DBA_TAB_SUBPARTITIONS
           
          --顯示當前用戶可訪問的所有組合分區(qū)表的子分區(qū)信息:
          select * from ALL_TAB_SUBPARTITIONS
           
          --顯示當前用戶所有組合分區(qū)表的子分區(qū)信息:
          select * from USER_TAB_SUBPARTITIONS
           
          --顯示分區(qū)列 顯示數(shù)據(jù)庫所有分區(qū)表的分區(qū)列信息:
          select * from DBA_PART_KEY_COLUMNS
           
          --顯示當前用戶可訪問的所有分區(qū)表的分區(qū)列信息:
          select * from ALL_PART_KEY_COLUMNS
           
          --顯示當前用戶所有分區(qū)表的分區(qū)列信息:
          select * from USER_PART_KEY_COLUMNS
           
          --顯示子分區(qū)列 顯示數(shù)據(jù)庫所有分區(qū)表的子分區(qū)列信息:
          select * from DBA_SUBPART_KEY_COLUMNS
           
          --顯示當前用戶可訪問的所有分區(qū)表的子分區(qū)列信息:
          select * from ALL_SUBPART_KEY_COLUMNS
           
          --顯示當前用戶所有分區(qū)表的子分區(qū)列信息:
          select * from USER_SUBPART_KEY_COLUMNS
           
          --怎樣查詢出oracle數(shù)據(jù)庫中所有的的分區(qū)表
          select * from user_tables a where a.partitioned='YES'
           
          --刪除一個表的數(shù)據(jù)是
          truncate table table_name;
           
          --刪除分區(qū)表一個分區(qū)的數(shù)據(jù)是
          alter table table_name truncate partition p5;




          http://tianzt.blog.51cto.com/459544/171759/
          posted @ 2012-09-12 16:59 abin 閱讀(328) | 評論 (0)編輯 收藏

          Oracle表分區(qū)和索引分區(qū)匯總

          為了簡化數(shù)據(jù)庫大表的管理,例如在數(shù)據(jù)倉庫中一般都是TB級的數(shù)量級.ORACLE8以后推出了分區(qū)選項.分區(qū)將表分離在若于不同的表空間上,用分而治之的方法來支撐元限膨脹的大表,組大表在物理一級的可管理性.將大表分割成較小的分區(qū)可以改善表的維護、備份、恢復、事務及查詢性能。

          分區(qū)的優(yōu)點:

          1、  增強可用性:如果表的一個分區(qū)由于系統(tǒng)故障而不能使用,表的其余好的分區(qū)仍可以使用;

          2、  減少關閉時間:如果系統(tǒng)故障只影響表的一部份分區(qū),那么只有這部份分區(qū)需要修復,礦能比整個大表修復花的時間更少;

          3、  維護輕松:如果需要得建表,獨產(chǎn)管理每個公區(qū)比管理單個大表要輕松得多;

          4、  均衡I/O:可以把表的不同分區(qū)分配到不同的磁盤來平衡I/O改善性能;

          5、  改善性能:對大表的查詢、增加、修改等操作可以分解到表的不同分區(qū)來并行執(zhí)行,可使運行速度更快,在數(shù)據(jù)倉庫的TP查詢特別有用。

          6、  分區(qū)對用戶透明,最終用戶感覺不到分區(qū)的存在。


          create tablespace dw1

          datafile 'D:\oracle\oradata\ora9\dw11.ora' size 50M
           

          create tablespace dw2

          datafile 'D:\oracle\oradata\ora9\dw21.ora' size 50M

           

          一、按范圍分區(qū):固名思義就是按一定range來分區(qū),看下面的例子:

          SQL> set linesize 1000

          SQL> create table niegc_part

             (

              part_id integer primary key,

              part_date date,

              part_dec varchar2(100)

              )

              partition by range(part_date)

              (

              partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dw1,

             partition part_02 values less than(to_date('2007-01-01','yyyy-mm-dd')) tablespace dw2,

             partition part_03 values less than(maxvalue) tablespace dw1

             );

           

          表已創(chuàng)建。

           

          SQL>

          SQL> insert into niegc_part values(1,to_date('2005-12-30','yyyy-mm-dd'),'less 20

          06-01-01');

           

          已創(chuàng)建 1 行。

           

          SQL> commit;

           

          提交完成。

           

          SQL> insert into niegc_part values(2,to_date('2006-01-01','yyyy-mm-dd'),'equal 2

          007-01-01');

           

          已創(chuàng)建 1 行。

           

          SQL> commit;

           

          提交完成。

           

          SQL> insert into niegc_part values(3,sysdate,'sysdate');

           

          已創(chuàng)建 1 行。

           

          SQL> commit;

           

          提交完成。

           

          SQL>

          SQL>

          SQL> select * from niegc_part partition(part_01);

           

             PART_ID PART_DATE  PART_DEC

          ---------- ---------- ----------------------------------------------------------

                   1 30-12月-05 less 2006-01-01

          SQL>

           

          相信只要對oracle 有點熟,都能知道上面的range分區(qū)的意思了.

           

          兩個字段以上的range分區(qū)大同小異,請看下面的例子:

          create table niegc_part
          (
          part_id integer primary key,
          part_date date,
          part_dec varchar2(100)
          )
          partition by range(part_id,part_date)
          (
          partition part_01 values less than(1,to_date('2006-01-01','yyyy-mm-dd')) tablespace dw,
          partition part_02 values less than(10,to_date('2007-01-01','yyyy-mm-dd')) tablespace dw,
          partition part_03 values less than(maxvalue,maxvalue) tablespace dw
          );
           

           

          二、Hash分區(qū)(散列分區(qū))。 散列分區(qū)通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使行這些分區(qū)大小一致。如將part_id的數(shù)據(jù)根據(jù)自身的情況散列地存放在指定的三個表空間中:

          create table niegc_part

          (

          part_id integer primary key,

          part_date date,

          part_dec varchar2(100)

          )

          partition by hash(part_id)

          (

          partition part_01  tablespace dw1,

          partition part_02  tablespace dw2

          );

           

          系統(tǒng)將按part_id將記錄散列地插入三個分區(qū)中,這里也就是二個不同的表空間中。

           

          三、復合分區(qū)。根據(jù)范圍分區(qū)后,每個分區(qū)內(nèi)的數(shù)據(jù)再散列地分布在幾個表空間中,這樣我們就要使用復合分區(qū)。復合分區(qū)是先使用范圍分區(qū),然后在每個分區(qū)同再使用散列分區(qū)的一種分區(qū)方法,如將part_date的記錄按時間分區(qū),然后每個分區(qū)中的數(shù)據(jù)分三個子分區(qū),將數(shù)據(jù)散列地存儲在三個指定的表空間中:

          create table niegc_part

          (

          part_id integer primary key,

          part_date date,

          part_dec varchar2(100)

          )

          partition by range(part_date) subpartition by hash(part_id)

          subpartitions 2 store in(dw1,dw2)

          (

          partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dw1,

          partition part_02 values less than(to_date('2007-01-01','yyyy-mm-dd')) tablespace dw2,

          partition part_03 values less than(maxvalue) tablespace dw1

          );


          先根據(jù)part_date進行范圍分區(qū),然后根據(jù)交易的ID將記錄散列地存儲在二個表空間中。

           

           

          四、索引分區(qū):

          注意: 對某個字段已做了分區(qū)了,是不允許再建立索引分區(qū)的。這一點要非常注意。
          全局索引建立時global子句允許指定索引的范圍值,這個范圍值為索引字段的范圍值:

          create index idx_part_id on niegc_part(part_dec)

          global partition by range(part_dec)

          (

          partition idx_1 values less than('1000') tablespace dw,

          partition idx_2 values less than(maxvalue) tablespace dw

          )

           

          局部索引分區(qū)的建立:(注意:表必須存在分區(qū),此分區(qū)的個數(shù)必須和分區(qū)表的分區(qū)個數(shù)一樣,不然是建立不起來的)

          create index idx_part_id on niegc_part(part_dec)

          local

          (

          partition idx_1 tablespace dw1,

          partition idx_2 tablespace dw2

          )

           

          五、分區(qū)維護:(只對范圍分區(qū))

          (1)、增加一個分區(qū):分區(qū)范圍只能往上增,不能增加一個少于原有的分區(qū):

          alter table niegc_part add partition part_03 values less than(maxvalue)

          (2)、合并分區(qū):(合并后的分區(qū)必須指下最后一個大value的分區(qū))

          alter table niegc_part merge partitions part_02,part_03 into  partition part_03

          (3)、刪除一個分區(qū):

          alter table niegc_part drop partition part_01

           


          分區(qū)維護:(只對范圍分區(qū))

            (1)、增加一個分區(qū):分區(qū)范圍只能往上增,不能增加一個少于原有的分區(qū):

            alter table tablename add partition new_partitionname values less than(maxvalue)

            (2)、合并/拆分分區(qū):(合并后的分區(qū)必須指下最后一個大value的分區(qū))

            alter table tablename merge partitions partitionname1,partitionname2 into partition partitionname2;

            alter table tablename split partition partitionname1 at (xx) into (

            partition newpartition1 ,partition newpartition2) ;

            注意:xx為分割點

           ?。?)、刪除一個分區(qū):

            alter table niegc_part drop partition partitionname;

            (4)將分區(qū)改名

            alter table table_name rename Partition partition_name to partition_name

            (5)將分區(qū)改表空間

            alter table table_name move partition_name

            tablespace tablespace_name nologging

            (6)查詢特定分區(qū)

            select count(*) from table_name partition (partition_name);

            (7)添加數(shù)據(jù)

            insert into table_name select * from table_name partition (partition_name)

            (8)分區(qū)表的導出

            userid=USER/PWD

            buffer=102400

            tables=table_name:partition_name,

            file=E:exp_paraxxx.dmp

            log=E:exp_paraxxx.log

            (9)技巧:刪除表中一個字段

            alter table table_name set unused column column_name;

            (10)加一個字段

            alter table table_name add column_name number(1);  




          http://www.cnblogs.com/rootq/archive/2008/12/24/1361631.html

          posted @ 2012-09-12 16:53 abin 閱讀(355) | 評論 (0)編輯 收藏

          /**
           * UserBean entity. @author MyEclipse Persistence Tools
           */

          public class UserBean implements java.io.Serializable {

           // Fields

           private String id1;
           private String name1;
           private java.util.Date createtime1;
           private String address;

           // Constructors

           /** default constructor */
           public UserBean() {
           }

           /** minimal constructor */
           public UserBean(String id1) {
            this.id1 = id1;
           }

           /** full constructor */
           public UserBean(String id1, String name1, java.util.Date createtime1, String address) {
            this.id1 = id1;
            this.name1 = name1;
            this.createtime1 = createtime1;
            this.address = address;
           }

           // Property accessors

           public String getId1() {
            return this.id1;
           }

           public void setId1(String id1) {
            this.id1 = id1;
           }

           public String getName1() {
            return this.name1;
           }

           public void setName1(String name1) {
            this.name1 = name1;
           }

           public java.util.Date getCreatetime1() {
            return this.createtime1;
           }

           public void setCreatetime1(java.util.Date createtime1) {
            this.createtime1 = createtime1;
           }

           public String getAddress() {
            return this.address;
           }

           public void setAddress(String address) {
            this.address = address;
           }

          }



          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "<!--
              Mapping file autogenerated by MyEclipse Persistence Tools
          -->
          <hibernate-mapping>
              <class name="com.lcdbtsf.air.po.UserBean" table="ABIN5" schema="ABIN" dynamic-update="true">
                  <id name="id1" type="string">
                      <column name="ID1" precision="0" />
                      <generator class="assigned" />
                  </id>
                  <property name="name1" type="string">
                      <column name="NAME1" default="defaultname1"/>
                  </property>
                  <property name="createtime1" type="java.util.Date">
                      <column name="CREATETIME1" length="19" />
                  </property>
                  <property name="address" type="string" update="true"  access="field" insert="true">
                      <column name="ADDRESS" default="defaultaddress" />
                  </property>
              </class>
             
              <query name="getUserBeanByAddress">
               <![CDATA[select o from UserBean o where o.address=:address order by o.createtime1 desc]]>
              </query>
             
               <!-- 命名查詢中使用sql,不推薦使用,影響跨數(shù)據(jù)庫
              <sql-query name="getUserBeanByAddress">
               <![CDATA[select o from UserBean o where o.address=:address order by o.createtime1 desc]]>
              </sql-query>
              -->
             
          </hibernate-mapping>




          package com.abin.lee.hibernate;

          import java.util.List;

          import junit.framework.TestCase;

          import org.hibernate.Criteria;
          import org.hibernate.HibernateException;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;
          import org.hibernate.cfg.Configuration;
          import org.hibernate.criterion.Order;

          import com.lcdbtsf.air.po.UserBean;

          public class UserDao extends TestCase {

           public  List<UserBean> getAll(){
            Configuration cfg = new Configuration().configure(); // 獲取hibernate的配置信息
            SessionFactory sf = cfg.buildSessionFactory(); // 根據(jù)config建立sessionFactory
            Session session = sf.openSession(); // factory用于建立session,開啟Session,相當于開啟JDBC的Connection
            Transaction ts = session.beginTransaction(); // 創(chuàng)建事務的對象ts
            List<UserBean> list=null;
            try {
             Criteria criteria=session.createCriteria(UserBean.class);
             criteria.addOrder(Order.desc("createtime1"));
             list=criteria.list();
             ts.commit();
            } catch (HibernateException he) {
             he.printStackTrace();
             ts.rollback();
            }
            return list;
           }
           
           public  List<UserBean> getAllByAddress(String address){
            Configuration cfg = new Configuration().configure(); // 獲取hibernate的配置信息
            SessionFactory sf = cfg.buildSessionFactory(); // 根據(jù)config建立sessionFactory
            Session session = sf.openSession(); // factory用于建立session,開啟Session,相當于開啟JDBC的Connection
            Transaction ts = session.beginTransaction(); // 創(chuàng)建事務的對象ts
            List<UserBean> list=null;
            try {
             Query query=session.getNamedQuery("getUserBeanByAddress");
             query.setParameter("address", address);
             list=query.list();
             ts.commit();
            } catch (HibernateException he) {
             he.printStackTrace();
             ts.rollback();
            }
            return list;
           }

          }





          package com.abin.lee.hibernate;

          import java.util.List;

          import junit.framework.TestCase;

          import org.hibernate.HibernateException;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;
          import org.hibernate.cfg.Configuration;

          import com.lcdbtsf.air.po.UserBean;

          public class UserDaoTest extends TestCase {

           public void test() {
             List<UserBean> list=new UserDao().getAllByAddress("shanghai");
            try {
             if(list.size()>0){
              UserBean user =list.get(0);
              System.out.println(list.get(0).getId1());
             }
            } catch (HibernateException he) {
             he.printStackTrace();  }
           }

          }

           


          僅列出標題
          共50頁: First 上一頁 27 28 29 30 31 32 33 34 35 下一頁 Last 
          主站蜘蛛池模板: 福清市| 翼城县| 昌都县| 高平市| 天峻县| 菏泽市| 咸阳市| 怀远县| 当雄县| 布尔津县| 师宗县| 辛集市| 榆树市| 锡林郭勒盟| 文安县| 彰武县| 贵溪市| 杭锦后旗| 抚松县| 南开区| 荥经县| 商河县| 阜新| 永福县| 鞍山市| 天水市| 仁怀市| 铜陵市| 湄潭县| 鸡泽县| 清水县| 徐汇区| 敦煌市| 丹东市| 盱眙县| 新干县| 鄱阳县| 丰城市| 莲花县| 桐城市| 闽清县|