一、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;
/
在輸出結果中顯示