1. 程式人生 > >第三節、PL/SQL編程

第三節、PL/SQL編程

擴展 other 數據庫 -- 邏輯 邏輯判斷 增加 style 數據

1、PL/SQL結合了過程語言和sql查詢語言的擴展語言,就是為sql增加了編程語言的特點,通過邏輯判斷、循環等操作實現復雜功能或計算。

[declare]
   --聲明部分:聲明用到的變量、類型、遊標,以及局部的存儲過程和函數
begin
    --執行部分:過程sql語句
[exception]
  --執行異常部分
end;
執行部分不能省略

pl/sql塊分類:無名塊、命名塊、子程序、觸發器、程序包

pl/sql符號:賦值 :=   連接 ||  單行註釋 --  多行註釋 /**/  範圍操作 ..

1.1pl/sql變量聲明

  v_ename VARCHAR2(20);   --聲明變量的類型和長度

  v_ename VARCHAR2(20) := ‘tom‘;  --聲明並賦值

程序變量 v_name
程序常量 c_name
遊標變量 cursor_name
異常標誌 e_name
表類型 name_table_type
name_table
記錄類型 name_record
綁定變量 g_name

常用變量類型:char、varchar、binary_integer、number(p,s)、long、date、boolean

常用引用類型:%type、%rowtype

2.1流程控制

if  <表達式> then
    --
執行部分 end if; if <表達式> then --執行部分 elsif <表達式> then --執行部分 end if; case when <表達式1> then -- when <表達式2> then -- [else] end; case <表達式> when <表達式結果1> then -- when <表達式結果2> then -- [else] end;
--循環
loop
    --執行的語句
exit when <條件語句> --滿足條件退出循環
end loop;

for 循環計數器  inreverse】 下限 ... 上限 loop
    --
end loop;
--例子:
1. for in loop形式

  DECLARE
     CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salary
     FROM employees ;
  BEGIN
     --隱含打開遊標
     FOR v_sal IN c_sal LOOP
     --隱含執行一個FETCH語句
        DBMS_OUTPUT.PUT_LINE(to_char(v_sal.employee_id)||---|| v_sal.ename||---||to_char(v_sal.salary)) ;
     --隱含監測c_sal%NOTFOUND
     END LOOP;
  --隱含關閉遊標
  END;

2.普通的遊標循環

  declare
  --定義遊標並且賦值(is 不能和cursor分開使用)
  cursor stus_cur is select * from students;
  --定義rowtype
  cur_stu students%rowtype;
  /*開始執行*/
  begin
  --開啟遊標
  open stus_cur;
   --loop循環
   loop
   --循環條件
   exit when stus_cur%notfound;
   --遊標值賦值到rowtype
   fetch stus_cur into cur_stu;
   --輸出
   dbms_output.put_line(cur_stu.name);
   --結束循環
   end loop;
  --關閉遊標
  close stus_cur;
  /*結束執行*/
 end;
3.高效的遊標循環
  declare
  cursor myemp_cur
  is select * from myemp;
  type myemp_tab is table of myemp%rowtype;
  myemp_rd myemp_tab;
  begin
   open myemp_cur;
   loop
   fetch myemp_cur bulk collect into myemp_rd limit 20;
   for i in 1..myemp_rd.count loop
    dbms_output.put_line(姓名:||myemp_rd(i).ename);
   end loop;
   exit when myemp_cur%notfound;
   end loop;
  end;
--goto、null的使用
decllare
    v_counter number :=1;
begin
loop 
    dbms_output.put_line(v_counter);
    v_conuter := v_counter +1;
    if v_conuter >10 then
            goto labeloffloop;--跳轉到標簽為lableoffloop的行
    else
        null;--為了使語法變得有意義
    end if;
end loop;
<<labeloffloop>>
    dbms_output.put_line(v_counter);
end;

3、異常處理,常用的異常處理方法

常見的oracle預定義異常

DUP_VAL_ON_INDEX:重復存儲唯一索引的數據庫列出現

INVALID_NUMBER:將字符串轉為數字時出現

NO_DATA_FOUND:表中不存在請求行時出現

TOO_MANY_ROWS:在執行select into 語句後返回多行時出現

VALUE_ERROR:變量的列值超出變量的大小

ZERO_DIVIDE:以零作為除數時出現

OTHERS:保證處理不漏過任何異常 ,可以使用函數sqlcode和sqlerrm返回錯誤代碼和錯誤文本信息。

自定義異常使用

declare
    v_name emp.name%type;
    e_name_null exception;
begin
    if v_name is null then
        raise e_name_null;
    end if;
exception
    when e_name_null then 
        dbms_output.line (名字不能為空‘);
end;
--註:raise_application_error存儲過程,可以重新定義異常錯誤消息
--raise_application_error(error_number,error_message);

第三節、PL/SQL編程