Oracle11G基本操做


[1].建立表空間數據庫

CREATE TABLESPACE SYPRO_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\SYPRO_201310.DBF' SIZE 10M AUTOEXTEND ON 編程

在指定的F盤下建立一個名SYPRO_201310.DBF的文件初始空間是10M當空間不足時自動增長數組

[2].刪除表空間同時刪除表空間全部硬盤上的物理文件緩存

DROP TABLESPACE SYPRO_201310 INCLUDING CONTENTS AND DATAFILES 函數

[3].查看當前用戶全部表空間學習

SELECT * FROM DBA_TABLESPACES 測試

[4].建立用戶liutao 密碼 liutao 默認表空間 SYPRO_201310 臨時表空間 TEMP編碼

CREATE USER liutao IDENTIFIED BY liutao DEFAULT TABLESPACE SYPRO_201310 TEMPORARY TABLESPACE  TEMP spa

[5].用戶受權-鏈接數據庫的權限排序

GRANT CONNECT TO LIUTAO WITH ADMIN OPTION

[6].用戶受權-數據庫管理員DBA角色

GRANT DBA TO LIUTAO WITH ADMIN OPTION

-- 建立表空間

CREATE TABLESPACE BOAICRM_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\BOAICRM_201310.DBF' SIZE 50M AUTOEXTEND ON ;

-- 建立用戶

CREATE USER BOAI IDENTIFIED BY BOAI DEFAULT TABLESPACE BOAICRM_201310 TEMPORARY TABLESPACE TEMP ;

-- 用戶受權

GRANT DBA TO BOAI WITH ADMIN OPTION ;

[7].刪除用戶

DROP USER LIUTAO

[8].刪除登陸數據庫的權限

REVOKE CONNECT FROM LIUTAO

=========修改數據表的一些經常使用操做=========

A.快速複製表結構但不復製表中的數據的方法:

CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD WHERE 1 = 2 ;

B.快速複製表結構和表中的數據的方法:

CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD

[9].修改已建立的表-添加字段

ALTER TABLE TB_STUDENT ADD EMAIL VARCHAR2(50)

[10].修改已建立的表-從新定義字段屬性

ALTER TABLE TB_STUDNET MODIFY EMAIL VARCHAR2(100)

[11].修改已建立的表-刪除字段

ALTER TABLE TB_STUDNET DROP COLUMN EMAIL

[12].修改已建立的表-字段重命名

ALTER TABLE TB_STUDNET RENAME COLUMN EMAIL TO EMAIL_163

[13].修改已建立的表-表重命名

RENAME TB_STUDNET TO TD_STUDNET

[14].給表加註釋

COMMENT ON TABLE TB_STUDNET IS '學生表'

[15].給字段加註釋

COMMENT ON COLUMN TB_STUDENT.EMAIL IS '郵箱'

[16].刪除表

DROP TABLE TB_STUDNET 保留回滾段可恢復

DROP TABLE TB_STUDNET Purge 刪除後不可恢復

[17].恢復已刪除的表-10G新特性

FlashBack TABLE TB_STUDNET TO BEFORE DROP

=========數據表的約束和維護=========

[18].添加約束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_ID_PK PRIMARY KEY ID 主鍵約束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_EMAIL_UK UNIQUE EMAIL 惟一性約束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_CLASS_ID_FK FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (CLASS_ID) 外鍵約束

[19].刪除約束

ALTER TABLE TB_STUDENT DROP CONSTRAINTS TB_STUDENT_CLASS_ID_FK 

[20].禁用約束

ALTER TABLE TB_STUDENT DISABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK

[21].激活約束

ALTER TABLE TB_STUDENT ENABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK

[22].用戶解鎖

ALTER USER SCOTT ACCOUNT UNLOCK

[23].從新設密碼

ALTER USER SCOTT IDENTIFIED BY TIGER

===========PL/SQL編程部分=========

[24].PLSQL語法規則:

DECLARE

/**聲明部分在此處聲明要使用的變量、遊標、以及局部的存儲過程及函數。**/

BEGIN 

/** 執行部分過程及SQL **/

EXCEPTION

/** 異常處理部分 **/

END 

/** 結束部分 **/

DECLARE   

STR varchar(50):='HELLOWORD' ;  

BEGIN  

  STR:=STR || 'LIUTAO' ;    

  dbms_output.put_line(STR) ;  

EXCEPTION   

  WHEN OTHERS THEN     

  dbms_output.put_line('發生錯誤');    

END ;

其中 := 是賦值符號 || 是字符鏈接符號 dbms_output.put_line()是一個輸出方法

[1].--查詢功能實現

DECLARE 

V_ID NUMBER ;

V_NAME VARCHAR(50) ;

BEGIN 

  SELECT STU_ID,STU_NAME 

  INTO V_ID ,V_NAME FROM TB_STUDENT 

  WHERE STU_ID = 11 ;  

  dbms_output.put_line('V_ID=' || V_ID) ;

  dbms_output.put_line('V_NAME=' || V_NAME);  

END ;

[2].--添加功能

DECLARE

BEGIN      

    INSERT INTO TB_STUDENT(STU_ID,STU_NAME,STU_AGE) VALUES(20,'劉江紅',10) ;

    commit;     

END ;

%TYPE 和 %ROWTYPE 用來表示不肯定類型

%TYPE 能夠理解成對數據庫表一個字段的副本

%ROWTYPE 能夠理解成對數據庫一行記錄提取出來的一個副本

[3].-- %TYPE用法示例 :

DECLARE 

V_STU_ID TB_STUDENT.STU_ID%TYPE ;

V_STU_NAME TB_STUDENT.STU_NAME%TYPE ;

V_STU_AGE TB_STUDENT.STU_AGE%TYPE ;

BEGIN    

SELECT STU_ID ,STU_NAME,STU_AGE INTO V_STU_ID ,V_STU_NAME,V_STU_AGE FROM TB_STUDENT WHERE STU_ID = 14 ;

DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_STU_ID);

DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_STU_NAME) ;

DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_STU_AGE) ;  

END ;

[4].--  %ROWTYPE用法示例 :

DECLARE     

    V_TB_STU_ROW TB_STUDENT%ROWTYPE ;    

BEGIN  

    SELECT * INTO V_TB_STU_ROW FROM TB_STUDENT WHERE STU_ID=10;    

    DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_TB_STU_ROW.STU_ID) ;    

    DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_TB_STU_ROW.STU_NAME) ;     

    DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_TB_STU_ROW.STU_AGE) ;      

    DBMS_OUTPUT.PUT_LINE('STU_SEX=' || V_TB_STU_ROW.STU_SEX) ;    

END ;

[5].複合數據類型  特色包含多個內部組件、用於存放多個值。須要先定義類型而後用該類型可重複定義多個變量

1.數組 VARRAY 

語法:TYPE TYPE_NAME IS VARRAY (MAXINUM_SIZE) OF ELEMENT_TYPE

TYPE_NAME : 可變數組的名稱

MAXINUM_SIZE : 可變數組元素的最大數目

ELEMNET_TYPE : 數組元素的類型

可變數組的下標從1開始 

用法示例 :

--  VARRAY 用法示例 :

DECLARE    

    TYPE ARY IS VARRAY (5) OF VARCHAR2(20) ;    

    V_ARY ARY := ARY('LIUTAO','MANY','KING','SAN','ABBY') ; /** 不能直接使用需賦值給一個變量 **/    

BEGIN  

    DBMS_OUTPUT.PUT_LINE(V_ARY(1)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(2)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(3)) ; 

    DBMS_OUTPUT.PUT_LINE(V_ARY(4)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(5)) ;    

END ;

=======================================

2.可變數組 TABLE 與JAVA中的數組相似、能夠理解成可變數組、下標無限、按照二進制進行索引

-- TABLE 用法示例 :

DECLARE 

   TYPE ARY IS TABLE OF VARCHAR(30) INDEX BY BINARY_INTEGER ;   

   V_LIST ARY ;   

BEGIN  

   V_LIST(10) := 'HELLOWORD_LIUTAO' ;

   V_LIST(12) := 'WHERE AND STU_ID' ;   

   DBMS_OUTPUT.PUT_LINE('V_LIST(10) = ' || V_LIST(10)) ;

   DBMS_OUTPUT.PUT_LINE('V_LIST(12) = ' || V_LIST(12)) ;   

END ;

=======================================

3.RECORD 能夠理解成JAVA中的集合類型

-- RECORD 用法示例 :

DECLARE 

   TYPE ARY IS RECORD (        

        V_ID NUMBER ,

        V_NAME TB_STUDENT.STU_NAME%TYPE ,

        V_TB_STU TB_STUDENT%ROWTYPE  

   ) ;

   

   V_STUDENT ARY ;

BEGIN   

   SELECT STU_ID , STU_NAME , STU_AGE , STU_BIRTHDAY , STU_SEX INTO   V_STUDENT.V_ID ,  V_STUDENT.V_NAME ,   

    V_STUDENT.V_TB_STU.STU_AGE , V_STUDENT.V_TB_STU.STU_BIRTHDAY , V_STUDENT.V_TB_STU.STU_SEX  FROM TB_STUDENT WHERE STU_ID = 10 ;    

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_ID) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_NAME) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_AGE) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_BIRTHDAY) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_SEX) ;     

END ;

[6].PLSQL異常處理部分實例 :

-- 異常處理

DECLARE 

   TB_ROWS TB_STUDENT%ROWTYPE ;

   V_SQL_CODE VARCHAR2(200) ;

   V_SQL_MSG VARCHAR2(200) ;   

BEGIN   

  SELECT * INTO TB_ROWS FROM TB_STUDENT ;

  DBMS_OUTPUT.PUT_LINE('STU_NAME = ' || TB_ROWS.STU_NAME) ;  

  EXCEPTION -- 處理異常通用將異常信息記錄到數據庫表中保存                      

   WHEN OTHERS THEN     

  V_SQL_CODE := SQLCODE ; -- 返回錯誤編碼

  V_SQL_MSG := SQLERRM ;  -- 返回錯誤信息  

  INSERT INTO TB_ERROR (ID,TABLE_NAME,SQL_CODE,SQL_MSG) VALUES (TB_ERROR_SEQ.NEXTVAL ,'TB_STUDENT',V_SQL_CODE,V_SQL_MSG) ;  

  COMMIT ;  

END ;

[7].PLSQL流程控制語句與循環語句實例 :

[7.1] ************ 流程控制分支語句 ************

-- 語法規則 

-- IF (條件) THEN 執行的語句  

-- ELSIF (條件) THEN  執行的語句  

-- ELSE   

-- END IF ;

DECLARE  

 V_STR VARCHAR2(20) := 'LIUTAO' ;

BEGIN  

 IF (V_STR = 'LIUTAO') THEN   

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'LIUTAO') ;   

 ELSIF (V_STR = 'HELLO') THEN    

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'HELLO') ;    

 ELSE     

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || '都不知足條件') ;    

 END IF ;   

END ;

[7.2] ********** 循環語句 簡單循環 LOOP **********

DECLARE 

  V_INDEX NUMBER := 10 ;

BEGIN

  LOOP 

      V_INDEX := V_INDEX + 1 ;

      DBMS_OUTPUT.PUT_LINE(V_INDEX);

      EXIT  WHEN V_INDEX = 15 ;

  END LOOP ;

END ;

[7.3] ***************** 嵌套循環 *****************

DECLARE 

 V_A NUMBER := 0 ; 

 V_B NUMBER := 0 ; 

BEGIN   

 LOOP    

    V_A := V_A + 1 ;

    DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;    

    EXIT WHEN V_A = 4 ; -- 外循環四次

    V_B := 0 ;     

   LOOP      

    EXIT WHEN V_B = 4 ; -- 內循環再次    

    V_B := V_B + 2 ;     

    DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;  

   END LOOP ;   

 END LOOP ;

    DBMS_OUTPUT.PUT_LINE('結束循環...........') ;    

END ;

[7.4] *************** 跳出循環體方法 ***************

DECLARE 

 V_A NUMBER := 0 ; 

 V_B NUMBER := 0 ; 

BEGIN   

 <<OUTER>>LOOP  -- 加上外層循環標識符 OUTER    

    V_A := V_A + 1 ;

    DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;    

    EXIT WHEN V_A = 4 ; -- 外循環四次

    V_B := 0 ;         

   <<INNER>>LOOP  -- 加上內層循環標識符 OUTER      

    EXIT OUTER WHEN V_B = 8 ; -- 內循環兩次 當V_B = 8 時結束外層循環    

    V_B := V_B + 2 ;     

    DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;  

   END LOOP ;   

 END LOOP ;

    DBMS_OUTPUT.PUT_LINE('結束循環...........') ;       

END ;

[7.5] ************ FOR 循環語句 ****************

BEGIN

  FOR V_INDEX IN 1..20 LOOP

     DBMS_OUTPUT.PUT_LINE(V_INDEX) ;        

  END LOOP ;

END ; 

[7.6] ************ WHILE 循環語句 ************

DECLARE

   V_INDEX NUMBER := 1 ;

BEGIN

   WHILE V_INDEX < 10 LOOP 

     DBMS_OUTPUT.PUT_LINE(V_INDEX);

     V_INDEX := V_INDEX + 2 ;

   END LOOP ;

END ;

[7.6] ************ 遊標的使用  ************

遊標的做用 :提取結果集

DECLARE   

 CURSOR C_STUDENT IS SELECT * FROM TB_STUDENT ; -- 定義一個遊標提取表 TB_STUDNET 中的全部數據 

 C_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 聲明變量接收結果 

BEGIN 

 OPEN C_STUDENT ; -- 打開遊標 

 LOOP    

    FETCH C_STUDENT INTO C_STUDENT_ROW ; -- FETCH關鍵字用來提取一行記錄

    EXIT WHEN C_STUDENT%NOTFOUND ; -- 判斷是否還有記錄提取

    DBMS_OUTPUT.PUT_LINE('STU_ID = ' || C_STUDENT_ROW.STU_ID || 'STU_NAME = ' || C_STUDENT_ROW.STU_NAME) ;    

 END LOOP ; 

 CLOSE C_STUDENT ; -- 關閉遊標 

END ;

-- 遊標使用案例查詢全部班級信息並列出對應班級的全部學生信息

-- 學習使用帶參數的遊標

DECLARE -- 聲明部分

  CURSOR C_CLASS_CURSOR IS SELECT * FROM TB_CLASS ;-- 班級遊標

  CURSOR C_STUDENT_CURSOR(V_CLASS_ID NUMBER) IS SELECT * FROM TB_STUDENT WHERE STU_CLASS_ID = V_CLASS_ID ; -- 學生遊標  

  V_CLASS_RESULT TB_CLASS%ROWTYPE ; -- 保存班級信息

  V_STUDENT_RESULT TB_STUDENT%ROWTYPE ; -- 保存學生信息  

BEGIN  -- 執行部分  

  OPEN C_CLASS_CURSOR ; -- 打開遊標

  LOOP 

    FETCH C_CLASS_CURSOR INTO V_CLASS_RESULT ; -- 提取結果

    EXIT WHEN C_CLASS_CURSOR%NOTFOUND ; -- 判斷是否還有結果

    DBMS_OUTPUT.PUT_LINE('CLASS_ID = ' || V_CLASS_RESULT.CLASS_ID || 'CLASS_NAME = ' || V_CLASS_RESULT.CLASS_NAME) ;

      OPEN C_STUDENT_CURSOR(V_CLASS_RESULT.CLASS_ID) ; -- 打開學生遊標要傳參數

      LOOP

        FETCH C_STUDENT_CURSOR INTO V_STUDENT_RESULT ;

        EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ; 

        DBMS_OUTPUT.PUT_LINE('STU_ID = ' || V_STUDENT_RESULT.STU_ID || 'STU_NAME' || V_STUDENT_RESULT.STU_NAME); 

      END LOOP ;

      CLOSE C_STUDENT_CURSOR ; -- 關閉遊標

  END LOOP ;

  CLOSE C_CLASS_CURSOR ; -- 關閉遊標  

END ; -- 結束部分

[8].PLSQL程序單元

主要有四類:過程:執行特定操做、無返回值

   函數:進行復雜計算、有返回值

   包:邏輯上相關的過程和函數組合到一塊兒

   觸發器:事件觸發執行相應操做

[8.1] ************ 存儲過程 ************

-- 第一個無參的存儲過程

CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT

IS V_SEX VARCHAR2(4) := '女';

BEGIN

  INSERT INTO TB_STUDENT

    (STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)

  VALUES

    (TB_ERROR_SEQ.NEXTVAL, 'LIUTAO', 11, V_SEX, SYSDATE, 1015,);

  COMMIT ;  

END INSERT_TB_STUDENT;

-- 有參數的存儲過程

CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT_PARAMS (       

 STU_NAME IN VARCHAR2 ,

 STU_AGE IN NUMBER ,

 STU_SEX IN VARCHAR2 ,

 STU_BIRTHDAY IN DATE ,

 STU_CLASS_ID IN NUMBER 

)

IS  

BEGIN     

   INSERT INTO TB_STUDENT

    (STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)

  VALUES

    (TB_ERROR_SEQ.NEXTVAL, STU_NAME ,STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID);

  COMMIT ;    

END INSERT_TB_STUDENT_PARAMS ;

-- 測試存儲過程的方法

BEGIN 

   INSERT_TB_STUDENT_PARAMS('張三',14,'男',SYSDATE,1015) ;

END ;

-- 存儲過程實例應用之數據表定時備份:

-- 將TB_STUDENT表中的數據備份到TB_STUDENT_BACK表中、TB_BACK_MAXID表記錄備份的表名、和已完成備份的最大ID

CREATE OR REPLACE PROCEDURE BACK_DATA(MAX_ID NUMBER) 

IS 

  CURSOR C_STUDENT_CURSOR IS 

  SELECT * FROM TB_STUDENT WHERE STU_ID > MAX_ID ; -- 定義遊標提取TB_STUDENT表中的數據  

  TB_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 定義變量存儲遊標的數據  

  V_INDEX NUMBER := 0 ; -- 分段提交的標識

  V_MAX_ID NUMBER := 0 ; -- 最在備份ID

BEGIN   

  IF C_STUDENT_CURSOR%ISOPEN THEN -- 斷送遊標是否打開

    NULL ;

  ELSIF 

    OPEN C_STUDENT_CURSOR ;    -- 打開遊標

  END IF ;        

  LOOP     

   INDEX := INDEX + 1 ;   

   FETCH C_STUDENT_CURSOR INTO TB_STUDENT_ROW ; -- 提取學生表中的數據

   EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;  

   INSERT INTO TB_STUDENT_BACK (STU_ID,STU_NAME,_STU_AGE,STU_SEX,STU_BIRTHDAY,STU_CLASS_ID)

   VALUES (C_STUDENT_ROW.STU_ID,C_STUDENT_ROW.STU_NAME,C_STUDENT_ROW.STU_AGE,C_STUDENT_ROW.STU_BIRTHDAY,C_STUDENT_ROW.STU_CLASS_ID) ;

   IF V_INDEX = 2000 THEN

     COMMIT ; -- 分段提交防止內存溢出

     V_INDEX := 0 ;

   END IF ;   

  END LOOP ;  

  SELECT MAX(MAX_ID) INTO V_MAX_ID FROM TB_STUDENT_BACK ;

  -- 備份完成及時更新已完成的最大備份ID

  UPDATE TB_BACK_MAXID SET MAX_ID = V_MAX_ID WHERE TABLE_NAME = 'TB_STUDENT' ;  

  COMMIT ;  

  CLOSE TB_STUDENT_CURSOR ;  

END BACK_DATA ;

-- 調用備份存儲過程

CREATE OR REPLACE PROCEDURE EXECUTION_BACK 

IS

  V_MAX_ID NUMBER := 0 ;

BEGIN

  SELECT MAX_ID INTO V_MAX_ID FROM TB_BACK_MAXID WHERE TABLE_NAME='TB_STUDENT' ;

  BACK_DATA(V_MAX_ID) ;

END EXECUTION_BACK ;


--  測試備份存儲過程

BEGIN

  EXECUTION_BACK ;

END ;

-- 定時完成備份工做

DECLARE

  JOBNO NUMBER  ;

BEGIN

  DBMS_JOB.SUBMIT(          

          JOBNO ,

          WHAT => 'EXECUTION_BACK ;' , -- 要執行的存儲過程名稱

          Interval => 'TRUNC(SYSDATE,''MI'')+3/(24*60)' -- 定義時間間隔每三分鐘

  ) ;

  COMMIT ;

END ;

[8.2] ***************PLSQL函數***************

函數與過程的區別是函數有返回值

-- 計算年薪的函數

CREATE OR REPLACE FUNCTION FUN_COUNT_SAL(

                                          SAL IN NUMBER

                                         ) 

                                         RETURN NUMBER IS 

  

BEGIN  

  RETURN SAL*12 ;  

END FUN_COUNT_SAL;

-- 測試函數

DECLARE

 V_SAL NUMBER ;

BEGIN    

 SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO='7521' ;

 DBMS_OUTPUT.PUT_LINE(FUN_COUNT_SAL(V_SAL)) ;

END ;

[8.3] ***************PLSQL程序包***************

A.-- 定義程序包 :

CREATE OR REPLACE PACKAGE FK_COUNT_SAL IS

  V_BOUNS NUMBER := 150 ; -- 定義變量每個月150獎金 

  -- 定義一個求年薪的函數

  FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER ;  

  -- 定義一個添加學生的過程

  PROCEDURE INSERT_STUDENT ;  

END FK_COUNT_SAL;

B.--  定義包體用於實現包中定義的函數和方法:

CREATE OR REPLACE PACKAGE BODY FK_COUNT_SAL IS 

 FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER IS   

 BEGIN 

    RETURN (V_SAL+V_BOUNS)*12 ;

 END ;

 PROCEDURE INSERT_STUDENT IS   

 BEGIN

   INSERT INTO TB_STUDENT (STU_ID,STU_NAME,STU_AGE,STU_SEX) VALUES (TB_ERROR_SEQ.NEXTVAL,'POW',12,'男') ;

   COMMIT ;

 END ; 

END FK_COUNT_SAL;

C.-- 測試程序包

DECLARE

  V_SAL NUMBER ;  

BEGIN  

   SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = '7369' ;   

   DBMS_OUTPUT.PUT_LINE(FK_COUNT_SAL.COUNT_EMP_SAL(V_SAL => V_SAL)) ;   

   FK_COUNT_SAL.INSERT_STUDENT ;   

END ;

[8.4] ***************PLSQL觸發器***************

[二]. ***************ORACLE錶鏈接查詢***************

普通等值鏈接(內鏈接)查詢:

SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO ; 可鏈接多張表、可用 AND 加多個條件限定結果。

標準SQL寫法:

SELECT * FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 標準SQL寫法等值鏈接稱爲內鏈接條件用ON限定。

外鏈接查詢分爲左外鏈接和右外鏈接:

左外鏈接:以左表爲主表、右表爲驅動表、左表中的數據所有列出、在右表中沒有匹配的項則用NULL補齊。

右外鏈接:以右表爲主表、左表爲驅動表、右表中的數據所有列出、在左表中沒有匹配的項則用NULL補齊。

普通寫法:

SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO ; 加號在左邊表示以右表爲主表。

SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO(+) ; 加號在右邊表示以左表爲主表。

標準SQL寫法:

SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 右鏈接查詢。

SELECT * FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 左鏈接查詢。

[三]. 組函數、GROUP BY 分組子句、ORDER BY 排序子句

HAVING 與 WHERE 的區別 :

WHERE是在分組前進行條件過濾 

HAVING是在分組後進行條件過濾

WHERE子句中不能存在分組函數

HAVING子句中可使用分組函數

[四]. 多行比較運算符

IN 與列表中的任一成員相等

ANY 與子查詢返回的每個值比較

ALL 與子查詢返回的全部值比較

SELECT * FROM EMP WHERE SAL > ANY (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資大於子查詢返回結果中最小的值都知足條件 。

SELECT * FROM EMP WHERE SAL < ANY (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資小於子查詢中返回結果最大的值都是知足條件。

SELECT * FROM EMP WHERE SAL < ALL (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工資小於子查詢中返回結果最小的值才知足條件 。

SELECT * FROM EMP WHERE SAL > ALL (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 大於全部返回值即大於最大的值才知足條件 。

案例:刪除表中的重複數據保留一條、如今TB_STUDNET表假設STU_NAME和STU_SEX徹底相同則認爲是重複。

1.建立臨時表 CREATE TABLE TB_STUDENT_TMP AS SELECT DISTINCT STU_NAME , STU_SEX FROM TB_STUDENT 

2.刪除原有數據表中的數據 TRUNCATE TABLE TB_STUDENT

3.將臨時表中的數據插回來 INSERT INTO TB_STUDENT SELECT * FROM TB_STUDENT_TMP 

案例:刪除表中的重複數據不保留

DELETE FROM TB_STUDENT WHERE ROWID IN ( SELECT ROWID FROM TB_STUDENT GROUP BY  STU_NAME , STU_SEX HAVING COUNT(*) > 1 )

[五].DECODE 函數的用法

SELECT DECODE(ENAME,'SCOTT','LIUTAO','POW') ENAME ,DEPTNO FROM EMP 查詢員工表若是姓名是SCOTT則顯示LIUTAO不然顯示WANGWU 。

[六].ORACLE 中的序列 SEQUENCE

-- 建立序列

CREATE SEQUENCE STUDENT_SEQ 

MINVALUE 1 -- 最小值

MAXVALUE 9999999 -- 最大值

START WITH 1 -- 從1開始

INCREMENT BY 1 -- 每次遞增1

CACHE 20 -- 緩存20個值

SELECT STUDENT_SEQ.NEXTVAL FROM DUAL ; 查看下一值

SELECT STUDENT_SEQ.CURRVAL FROM DUAL ; 查看當前值必須是至少執行一次NEXTVAL纔有值

-- 刪除序列

DROP SEQUENCE STUDENT_SEQ 

[七].ORACLE中的同義詞

-- 同義詞 爲簡化操做有時須要對某些表或視圖建立一個同義詞來引用

CREATE SYNONYM TB_CLS FOR SCOTT.TB_CLASS ; 之後則查詢TB_CLS就是查詢表TB_CLASS 

[八].ORACLE中的索引 加快數據檢索

主鍵約束和惟一性約束系統自動建立對應的索引。

手動建立索引:

CREATE INDEX TB_ERROR_SQL_MSG ON TB_ERROR(SQL_MSG) ; 爲TB_ERROR表中字段SQL_MSG建立索引名稱爲TB_ERROR_SQL_MSG 

刪除索引:

DROP INDEX TB_ERROR_SQL_MSG 

[九].ORACLE視圖 簡化查詢

簡單視圖:

CREATE VIEW LIU_EMP AS SELECT * FROM SCOTT.EMP ;

相關文章
相關標籤/搜索