第三節、PL/SQL編程
阿新 • • 發佈:2018-07-05
擴展 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 循環計數器 in 【reverse】 下限 ... 上限 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編程