一、什麼是PL/SQL ?
PL/SQL(Procedure Language/SQL)
PL/SQL 是 Oracle 對 sql 語言的過程化擴展,指在 SQL 命令語言中增加了過程處理語句(如分支、循
環等),使 SQL 語言具有過程處理能力。把 SQL 語言的數據操縱能力與過程語言的數據處理能力結合
起來,使得 PLSQL 面向過程但比過程語言簡單、高效、靈活和實用。
範例 1: 爲職工漲工資,每人漲 10%的工資。update emp set sal=sal*1.1
範例 2:按職工的職稱長工資,總裁漲 1000 元,經理漲 800 元,其他人員漲 400 元。
這樣的需求我們就無法使用一條 SQL 來實現,需要藉助其他程序來幫助完成,也可以使用 pl/sql。
pl/sql 編程語言是對 sql 語言的擴展,使得 sql 語言具有過程化編程的特性。
pl/sql 編程語言比一般的過程化編程語言,更加靈活高效。
pl/sql 編程語言主要用來編寫存儲過程和存儲函數等。
二、pl/sql 程序語法
程序語法:
declare
說明部分 (變量說明, 遊標申明,例外說明 〕
begin
語句序列 (DML 語句〕 …
exception
例外處理語句
End;
1. 常量和變量定義
在程序的聲明階段可以來定義常量和變量。
- 變量的基本類型就是 oracle 中的建表時字段的變量如 char, varchar2, date, number,
boolean, long
- 引用變量
- 記錄型變量
---賦值操作可以使用:=也可以使用into查詢語句賦值
declare
i number(2) := 10;
s varchar2(10) := '小明';
ena emp.ename%type;---引用型變量
emprow emp%rowtype;---記錄型變量
begin
dbms_output.put_line(i);
dbms_output.put_line(s);
select ename into ena from emp where empno = 7788;
dbms_output.put_line(ena);
select * into emprow from emp where empno = 7788;
dbms_output.put_line(emprow.ename || '的工作爲:' || emprow.job);
end;
2. if 分支
語法 1:
IF 條件 THEN 語句 1;
語句 2;
END IF;
語法 2:
IF 條件 THEN 語句序列 1;
ELSE 語句序列 2;
END IF;
語法 3:
IF 條件 THEN 語句;
ELSIF 語句 THEN 語句;
ELSE 語句
END IF;
- 範例 1:如果從控制檯輸入 1 則輸出我是 1
- 範例 2: 如果從控制檯輸入 1 則輸出我是 1 否則輸出我不是 1
- 範例 3:判斷人的不同年齡段 18 歲以下是未成年人, 18 歲以上 40 以下是成年人, 40 以上是老年人
---輸入小於18的數字,輸出未成年
---輸入大於18小於40的數字,輸出中年人
---輸入大於40的數字,輸出老年人
declare
i number(3) := ⅈ
begin
if i<18 then
dbms_output.put_line('未成年');
elsif i<40 then
dbms_output.put_line('中年人');
else
dbms_output.put_line('老年人');
end if;
end;
3. LOOP 循環語句
語法 1:
WHILE total <= 25000 LOOP
.. .
total : = total + salary;
END LOOP;
語法 2:
Loop
EXIT [when 條件];
……
End loop
語法 3:
FOR I IN 1 . . 3 LOOP
語句序列 ;
END LOOP ;
- 範例:使用語法 1 輸出 1 到 10 的數字
- 範例:使用語法 2 輸出 1 到 10 的數字
- 範例:使用語法 3 輸出 1 到 10 的數字
---用三種方式輸出1到10是個數字
---while循環
declare
i number(2) := 1;
begin
while i<11 loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
---exit循環
declare
i number(2) := 1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;
---for循環
declare
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
4. 遊標 Cursor
在寫 java 程序中有集合的概念,那麼在 pl/sql 中也會用到多條記錄,這時候我們就要用到遊標,
遊標可以存儲查詢返回的多條數據
- 範例 1:使用遊標方式輸出 emp 表中的員工編號和姓名
- 範例 2:按員工的工種漲工資,總裁 1000 元,經理漲 800 元其,他人員漲 400 元。
--備份出一張新表爲 myemp;create table myemp as select * from emp;
declare
cursor pc is select * from myemp;
addsal myemp.sal%type;
pemp myemp%rowtype;
begin
open pc;
loop
fetch pc into pemp;
exit when pc%notfound;
if pemp.job = 'PRESIDENT' then addsal := 1000;
elsif pemp.job = 'MANAGER' then addsal := 800;
else addsal := 400;
end if;
update myemp t set t.sal = t.sal + addsal where t.empno = pemp.empno;
end loop;
close pc;
end;
- 範例 3:寫一段 PL/SQL 程序,爲部門號爲 10 的員工漲工資
---遊標:可以存放多個對象,多行記錄。
---輸出emp表中所有員工的姓名
declare
cursor c1 is select * from emp;
emprow emp%rowtype;
begin
open c1;
loop
fetch c1 into emprow;
exit when c1%notfound;
dbms_output.put_line(emprow.ename);
end loop;
close c1;
end;
-----給指定部門員工漲工資
declare
cursor c2(eno emp.deptno%type)
is select empno from emp where deptno = eno;
en emp.empno%type;
begin
open c2(10);
loop
fetch c2 into en;
exit when c2%notfound;
update emp set sal=sal+100 where empno=en;
commit;
end loop;
close c2;
end;
----查詢10號部門員工信息
select * from emp where deptno = 10;