1. 程式人生 > >從零開始學習Oracle

從零開始學習Oracle

從零開始學Oracle—PL/SQL(七)    PL/SQL簡介    PL/SQL(Procedural Language Sql,過程語言|SQL)是結合了Oracle過程語言和結構化查詢語言(SQL)的一種擴充套件語言.    PL/SQL塊是一段後臺服務程式,它負責將資料從資料庫中取出來,在PL/SQL塊中進行處理,將處理的結果送到資料庫.   優點:    1,支援SQL    2,支援面向物件程式設計(OOP)    3,更好的效能    4,可移置性    5,與SQL整合 --支援所有SQL資料型別和Null值 ,另%type  %rowType屬性型別更加強了這種整合    6,安全性   PL/SQL塊包括3個部分:   1,宣告部分    --變數,遊標,自定義異常, 區域性子程式   2,可執行部分   --執行命令,可巢狀子塊   3,異常處理部分  1PL/SQL塊  2  declare  3  4  begin  5   --SQL語句  6   --直接寫的SQL語句(DML/TCL)  7   --間接寫execute immediate <DDL/DCL命令字串>   8   --select 語句  9         <1>必須帶有into子句 10             select empno into eno from emp 11           where empno =7369; 12        <2>只能查到一行********** 13        <3>欄位個數必須和變數的個數一致 14  exception  --異常 15    when <異常名字> then --特定異常 16        <處理語句> 17    when others then  --所有異常都可捕獲 18        <處理語句>    19  end; 20 關鍵字: 分層查詢 函式 觸發器語法 Oracle物化檢視 跟蹤sql語句  本文詳細介紹從零開始學Oracle—PL/SQL(七)    語言特徵:   <1>,大小寫不敏感   <2>,複合符號的含義    :=   賦值操作符   ||連線操作符  ..範圍操作符  **求冪操作符 《,》標籤分隔符    --單行註釋  /*,*/多行註釋   <3>宣告變數   --變數名  資料型別 :=值  例: varA  varchar2(10):='宣告變數';   <4>宣告常量   --變數名 constant 資料型別 := 值     ---------------- 技巧:初始化變數和常量時,保留字default可替換:=賦值操作符--------------   <5>屬性型別    %type   --引用某個變數或資料庫列的資料型別來宣告變數    %rowType  --提供表示表中一行的記錄型別   <6>控制結構    a,條件控制  if  then  或     if  then  else   或    if  then  elsif   或     case    b,迴圈控制 loop                   while              exit或exit when退出                   for    c,順序控制  Goto             Null語句   語法示例:   1--PL/SQL 簡單語法   2   3Begin   4  null;     5End;   6/   7   8Declare   9  varA number(4);  10Begin  11  varA := 1234;  12  DBMS_output.put_line(varA);  13End;  14/  15  16Declare  17  varA number(4);  18Begin  19  varA := 1234;  20  DBMS_output.put_line(varA);  21  Declare  22    varB number(4):=2234;  23  Begin  24    DBMS_output.put_line(varA);  25    DBMS_output.put_line(varB);  26  End;  27  DBMS_output.put_line(varB);  28End;  29/  30  31Declare  32  varA number(4);  33  varB number(4):=2234;  34Begin  35  varA := 1234;  36  DBMS_output.put_line(varA||'  '||varB);  37End;  38/  39Begin塊 注意事項:  40-- 資料定義語言不能直接執行  41Begin  42  drop table depta;  43End;  44/  45  46-- select不能直接執行  47select  --必須使用select into 形式,只能且必須返回一行  48Declare   49  varE empa%rowType;  --與表的一行型別一樣  50  vno empa.empno%type;  -- 與表的某列型別一樣  51Begin  52  vno := 7902;  53  select * into varE from empa where empno = vno;  54  DBMS_output.put_line( varE.ename||'  '||varE.job);  55End;  56/  57  58inset  --可以直接執行  59Declare  60  vno empa.empno%type;  61  vna empa.ename%type;  62  vjob empa.job%type;  63Begin  64  vno := 1236;  65  vna := 'Wing';  66  vjob := 'MANAGER';  67  insert into empa (empno,ename,job) values(vno,vna,vjob);  68End;  69/  70  71delete --可以直接執行  72Declare  73  vno empa.empno%type;  74Begin  75  vno := 5555;  76  delete from empa where empno = vno;  77End;  78/  79  80  81update --可以直接執行  82Declare  83  vno empa.empno%type;  84  rsal empa.sal%type;  85Begin  86  vno := 1236;  87  rsal := 100;  88  update empa set sal = nvl(sal,0) + rsal where empno = vno;  89End;  90/  91  92 --事物控制語言可以直接執行  93Declare   94  vno empa.empno%type;  95  rsal empa.sal%type;  96Begin  97  vno := 1236;  98  rsal := 100;  99  update empa set sal = nvl(sal,0) + rsal where empno = vno; 100  commit; 101End; 102/ 103 104 -- 資料安全語言(DCL)不能直接執行 105Begin 106  grant connect to scott; 107End; 108/ 關鍵字: 分層查詢 函式 觸發器語法 Oracle物化檢視 跟蹤sql語句  本文詳細介紹從零開始學Oracle—PL/SQL(七)     例子: 題:編寫程式 向DEPT表中插入一條記錄,     從鍵盤輸入資料,如果     資料型別輸入錯誤要有提示     無法插入記錄 也要有提示     只能輸入正數,如果有負數提示     declare     n number;     no dept.deptno%type;     nm dept.dname%type;     lc dept.loc%type;     exp exception;   --使用者定義的變數     exp1 exception;   --使用者定義的變數     num number:=0;   --計數器      pragma exception_init(exp,-1); --預定義語句     --捆綁Oracle內建異常(-1錯誤和異常變數關聯),-1 主鍵衝突     pragma exception_init(exp1,-1476);除零異常     e1 exception; --使用者定義的變數    begin     --輸入值       no := '&編號';      num := num + 1;      if no < 0 then         raise e1;    --自定義異常的引發       end if;      nm := '&名稱';      num := num +1;      lc := '&地址';        num := num +1;      n := 10 /0;           insert into dept values (no,nm,lc);      num := num +1;      commit;    exception      --自定義異常      when e1 then         dbms_output.put_line('編號不能為負數');       --資料型別不對      when value_error then          if num =0 then            dbms_output.put_line('編號資料型別不對');          elsif num = 1 then          dbms_output.put_line('名稱資料型別不對');          elsif num =2 then          dbms_output.put_line('地址資料型別不對');          end if;         rollback;      --主鍵衝突      when exp then          --sqlcode全域性變數 異常錯誤號          --sqlerrm全域性變數 異常的文字資訊            --dbms_output.put_line('異常的編號:'||sqlcode);          --dbms_output.put_line('異常的內容:'||sqlerrm);          --dbms_output.put_line('編號已存在') ;          rollback;      --非預定義異常(關聯錯誤號)       when exp1 then         dbms_output.put_line('0做了除數') ;           raise_application_error(-20001,'0做了除數');           --引起一個自定義的錯誤            --預先保留-20001 到 -29999編號          rollback;       --其他的異常       when others then          dbms_output.put_line('異常的編號:'||sqlcode);          dbms_output.put_line('異常的內容:'||sqlerrm);         -- dbms_output.put_line('出現錯誤');          rollback;    end;