pl/sql
什么是PL/SQL
PL/SQL是結合oracle過程語言和機構化查詢運行(SQL) 的一種擴展語言。使用PL/SQL可以編寫具有很多高級功能的程序,有以下優點
- PL/SOL可以采用過程性語言控制程序的結構,也就是說,結構,如判斷。循環等程序結構。
- 同其他的編程語言一樣,PL/SOL可以對程序中的錯誤進行自動處理,誤時不會中斷,即它的異常處理機制。
- PL/SOL程序塊具有更好的可移植性,可以移植到另一個Cracle數據庫中。
- PL/SOL程序減少了網絡的交互,有助於提高程序性能。
常量和變量的聲明與賦值
聲明並賦值:
declare /* ||注意命名規則 ||名稱不能超過30個字符 ||第一個字符必須為字母 ||不區分大小寫 ||不能用 減號 ||不能是SQL保留字 */ --聲明變量 ename varchar2(20) --聲明常量 賦值是用 := 賦值 '='用於比較 c_rate_incr constant number(7,2):=1.10 begin end;
賦值:
--聲明變量 v_ename varchar2(20); --聲明常量並使用 :=賦值 c_rate_incr constant number(7,2):=1.10; begin --通過select in同給變量賦值 select ename into v_ename from emp where empno='7788'; Dbms_Output.put_line('變量:'||v_ename); end;
結果
這種操作只能返回單行數據多了會報錯
屬性類型
使用%TYPE屬性的優點在於:
- 可以不必知道所引用的數據庫列的數據類型。
- 所引用的數據庫列的數據類型可以實時改變, 容易保持一一致,不用修改PL/S0L 程序。
%ROWTYPE返回一個記錄類型,其數據類型和數據庫表的數據結構相一致,這時可以使用%FOWTIFE,使用%ROWTYPE屬性的優點在於:
- 可以不必知道所引用的數據庫中列的個數和數據類型。
- 所引用的數據庫中列的個數和數據類型可以實時改變,容易保持一致不用修改PL/S0L 程序。
簡單來講 %type相當於一個普通的變量類型(字符或者數值),而%rowtype則是相當於集合可以保存多個變量信息
%type舉例:
declare --聲明變量 v_ename emp.ename%type;--聲明常量並使用 :=賦值 c_rate_incr constant number(7,2):=1.10; begin --通過select in同給變量賦值 select ename into v_ename from emp where empno='7788'; Dbms_Output.put_line('變量:'||v_ename); end;
結果
%rowtype舉例:
declare --聲明變量 v_ename emp%rowtype; --聲明常量並使用 :=賦值 c_rate_incr constant number(7,2):=1.10; begin --通過select in同給變量賦值 select * into v_ename from emp where empno='7788'; Dbms_Output.put_line('變量:'||v_ename.job||'--sal:'||v_ename.sal); end;
結果
pl/sql中的控制語句
if控制語句
begin if 9>0 then Dbms_Output.put_line('9>0'); else if 0>1 then Dbms_Output.put_line('0>1 '); else Dbms_Output.put_line('9<0'); end if; end;
結果:
case語句
--case 也就是switch一樣的功能 begin case 2 when 1 then Dbms_Output.put_line('2是1'); when 3 then Dbms_Output.put_line('2是3'); else Dbms_Output.put_line('2是2'); end case; end;
結果:
loop循環
--loop begin loop Dbms_Output.put_line('loop也就是do-while'); exit when 9>0; end loop; end;
結果:
for循環
--for begin for i in 1..6 loop Dbms_Output.put_line('i:'||i); end loop; end;
結果:
while循環
--while begin while 6>0 loop Dbms_Output.put_line('6>0'); exit; end loop; end;
- exit:跳出當前循環,使循環結束(相當與其他編程語言里面的break)
- continue:結束本次循環,進入下一次循環
- return:結束當前過程或者函數
順序控制
順序控制用於按順序執行語句.順序語句包括null語句和goto語句goto不推薦使用
--順序控制 begin if 6>0 then null;--為了使語法變得有意義,去掉null會報錯 else Dbms_Output.put_line('6>0'); end if; end;
null語句是一個可執行語句,相當於一個占位符或不執行任何操作的空語句,它可以使得某些語句變得有意義,提高程序可讀性,保證其他語句結構
的完整性和正確性.
begin if 6>0 then goto end_loop;--跳轉到 <<end_loop>> 此標記是自定義 else null; end if; <<end_loop>> Dbms_Output.put_line('6>0'); end;
- 標簽<<end_loop>>后面接一條可執行的語句,不能直接跟END IF或者其他END;
- 屬於plsql控制語句,用於程序控制非條件跳至指定標簽<<???>>。不易控制和維護,慎用!