PL/SQL程序結構及組成
什麼是PL/SQL?
SQL長處
常常使用的結合語言
PL/SQL的程序結構
declaresql
說明部分 (變量說明,光標申明,例外說明〕數據庫
beginoracle
語句序列 (DML語句〕… ide
exceptionoop
例外處理語句 post
End;fetch
/this
變量和常量的說明
1. 基本數據類型
Number 數字型
Int 整數型
Pls_integer 整數型。產生溢出時出現錯誤
Binary_integer 整數型。表示帶符號的整數
Char 定長字符型,最大255個字符
Varchar2 變長字符型。最大2000個字符
Long 變長字符型,最長2GB
Date 日期型
Boolean 布爾型(TRUE、FALSE、NULL三者取一)
在PL/SQL中使用的數據類型和Oracle數據庫中使用的數據類型。有的含義是全然一致的,
有的是有不一樣的含義的。
2. 基本數據類型變量的定義方法
變量名 類型標識符 [not null]:=值;
declare
age number(3):=26; --長度爲3,初始值爲26
begin
commit;
end;
當中。定義常量的語法格式:
常量名 constant 類型標識符 [not null]:=值;
declare
pi constant number(9):=3.1415926;--爲pi的數字型常量,長度爲9,初始值爲3.1415926
begin
commit;
end;
if語句
三種if語句
1. IF 條件 THEN 語句1;spa
語句2;設計
END IF;
2. IF 條件 THEN 語句序列1;
ESLE 語句序列 2;
END IF;
3. IF 條件 THEN 語句;
ELSIF 語句 THEN 語句;
ELSE 語句;
END IF;
小知識:獲取從鍵盤輸入的數據
accept num prompt '請輸入一個數字';
pnum number := #
循環語句
三種循環語句
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 ;
光標(Cursor)==ResultSet
說明光標語法:
1.定義光標
CURSOR 光標名 [ (參數名 數據類型[,參數名 數據類型]...)]
IS SELECT 語句;
好比:
cursorc1 is select ename from emp;
演示樣例
帶參數的光標
定義語句:
cursor c2(jobc varchar2)
is
select ename,salfrom emp
where job=jobc;
運行語句:
Open c2(‘clerk’);
Oracle的異常處理
例外
l例外是程序設計語言提供的一種功能,用來加強程序的健壯性和容錯性。
系統定義例外
用戶定義例外及處理例外
DECLARE
My_job char(10);
v_sal emp.sal%type;
No_data exception;
cursor c1 is select distinct jobfrom emp order by job;
begin
open c1;
Fetch c1 into v_job;
IF c1%notFOUND then raiseno_data;
end if;
…
EXCEPTION
WHEN no_data THEN insert into empvalues(‘fetch語句沒有得到數據或數據已經處理完');
END;
兩種賦值語句
利用:=賦值
lvar1:='this is a argument';
lemp_rec.sal:= sal*2 + nvl(comm,0);
lsum_sal:=sum_sal+v_sal;
利用into賦值
lFETCH c1 INTO e_eno , e_sal ;commit語句
凝視
-- This is a comment
或
/* This is a comment */
實例演示樣例
演示樣例1
爲員工長工資。
從最低工資調起每人長10%,但工資總額不能超過50萬元,
請計算長工資的人數和長工資後的工資總額,並輸出輸出長工資人數及工資總額。
先寫出可能用到的sql語句
select empno,sal from emp order by sal;
select sum(sal) from emp;
*/
set serveroutput on
declare
cursor c1 is select empno,sal from emp order by sal;
salTotal NUMBER; --記錄工資總額
empCount NUMBER := 0; --漲工資的人數
pempno emp.empno% TYPE; --記錄員工的編號
psal emp.sal%type; --記錄員工的工資
begin
--獲得當前總工資
select sum(sal) into salTotal from emp;
--打開遊標
open c1;
--運行循環
while salTotal <= 50000
loop
fetch c1 into pempno, psal;--取出一條記錄
exit when c1%notfound;
update emp set sal = sal * 1.1 where empno = pempno; --運行加薪
--記錄漲工資後的總額
salTotal := salTotal + psal*0.1;
--記錄漲工資的人數
empCount := empCount + 1;
end loop;
close c1;
commit;
dbms_output.put_line('漲工資人數:' || empCount || ' 工資總額:' || salTotal);
end;
/
演示樣例2
部門 小於3000數 3000-6000 大於6000 工資總額
10 2 1 0 8750
20 3 2 0 10875
30 6 0 0 9400
createtable msg1
(deptno number,
emp_num1 number,
emp_num2 number,
emp_num3 number,
sum_salnumber);