Oracle 原理: PL/SQL基礎

一、PL/SQL 功能和特點

 PL/SQL 是過程語言(Procedural Language)和結構化查詢(SQL)語言結合而成的編程語言;PL/SQL是SQL的擴展,支持大對象、集合類型。還可以給SQL語言增加程序邏輯。支持SQL,在PL/SQL種可以使用:數據操縱命令、事物控制命令、遊標控制、SQL函數和SQL運算符。PL/SQL有更佳的性能,當用戶把PL/SQL塊發送到服務器端,由Oracle服務器端編譯、運行、再把結果返回給用戶,可以移植性,可執行在任何操作系統上。PL/SQL可以通過存儲過程限制對用戶的訪問來提高安全性。

  Oracle服務器中有PL/SQL引擎 和 SQL引擎 ,PL/SQL引擎執行 for ,if 等過程語句 , 而SQL引擎執行 insert、delete等SQL語句

PL/SQL分爲三個部分,聲明部分、可執行部分、異常處理部分,其中可執行部分是必須要有的。

DECLARE
--聲明變量在這裏寫
BEGIN
--過程程序在這裏寫
EXCEPTION
--異常處理在這裏寫
END;

 

二、Oracle 11g的PL/SQL對序列的改進,即無dual序列的使用

----創建一個序列 seq ----
create sequence seq start with 1 increment by 1;
----SQL語句的序列取值必須用select -----
select seq.nextval from dual ;
----過程語句不需要select 也可以進行序列取值
declare 
 se positive ; --正整數
begin
  se :=seq.nextval ;
  -- select seq.nextval into se from dual ;
  dbms_output.put_line(se);   
 end;
/
drop sequence seq;

三、控制語句和continue語句

條件判斷語句: if ..then    ;    if..then..else; if..then.elsif..;   case  語句;

循環語句: Loop  [無條件循環內容 ] end loop ;    while [循環條件] loop [循環內容] end loop;   

                  for [循環體變量] in [循環體變量的取值範圍]  loop  [循環內容]  end loop;

注: Loop  [無條件循環內容 ] end loop 通常和exit搭配,相當於JAVA的break ,如果沒有控制語句搭配,相當於無限循環。

     continue; 直接進入下一個循環;

 

在PL過程語句中是不能使用DDL語句的,即create、drop、truncate等操作。想要用DDL語句必須用動態SQL執行:

execute immediate sql_command [into 執行結果集][using 綁定變量集 ]

---可重跑的SQL腳本:創建並初始化表示例------
declare
 sql_command varchar2(500);
 isExsit number ;
begin
  select count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; 
  if isExsit <> 0  then 
    sql_command :='truncate table salary_tbl';
    execute immediate sql_command;
    sql_command :='drop table salary_tbl';
    execute immediate sql_command;
  end if;
  sql_command := '  
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
)';
 execute immediate sql_command;
 for i in  1..13000
     loop
     insert into salary_tbl values('僱傭者'||i,'部門'||Mod(i,50),100+sqrt(i),'僱傭者'||Mod(i,20)); 
     if Mod(i,1000)=0 then 
       commit;
     end if;
   end loop;
 commit;
end; 
/

---goto 語句示例

declare
 sql_command varchar2(500);
 isExsit number ;
 i number := 1;
begin
  select count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; 
  if isExsit <> 0  then 
    sql_command :='truncate table salary_tbl';
    execute immediate sql_command;
    sql_command :='drop table salary_tbl';
    execute immediate sql_command;
  end if;  
  sql_command := '  
create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
)';
 execute immediate sql_command;
 <<code_aa>>    -
     insert into salary_tbl values('僱傭者'||i,'部門'||Mod(i,50),100+sqrt(i),'僱傭者'||Mod(i,20)); 
      if Mod(i,1000)=0 then 
       commit;
     end if;
     i :=i+1;
     if i <13000 then 
       goto code_bb;
     else 
       goto code_aa;
     end if ;   
   <<code_bb>> 
 commit;
end; 
/

 

四,Oracle11g 中的錯誤處理

異常分爲預定義異常和用戶自定義異常。預定義異常就是系統自帶的異常,而用戶自定義異常(raise)是自己聲明的相當於java的throw。

預定義異常  exception  when [異常名] then ... when [異常名2 ] then ...  

raise_application_error (異常編號異常信息)  即異常中斷程序並輸出異常信息

declare 
 department varchar(20) := '';
 nullinserterror1 exception;
begin
   if department is null then
     raise nullinserterror1;
   end if;
   insert into salary_tbl values('僱傭者9999',department,100,'僱傭者4'); 
exception 
   when nullinserterror1   then
     dbms_output.put_line('自定義空值插入異常');
     raise_application_error (-20001,'空值異常');
end;
/

在輸出結果中顯示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章