--創建過程
--語法形式如下
CREATE [OR REPLACE] PROCEDURE pname
[ (param1 [mode1] type1,
param2 [mode2] type2,
…)]
IS | AS
[variable1 type3 :=0;
variable2 type4 :=0;]
BEGIN PL/SQL Block
END [pname];
--OR REPLACE:表示如果同名對象已經存在就覆蓋
--pname:過程名稱
--param1、param2:形參名稱
--mode1、mode2:參數模式,包括IN(輸入參數 默認)、OUT(輸出參數)、IN OUT(既是輸入又是輸出)
--type1、type2、type3、type4:參數數據類型
--variable1、variable2:局部變量
--PL/SQL Block:PL/SQL代碼塊
--例:假設現在要創建這樣的過程,實現的功能是要給指定的(通過僱員編號指定)僱員加薪,如果僱員編號在7500以內加薪10%,僱員編號大於等於7500則加薪15%,創建存儲過程的SQL語句如下:
CREATE OR REPLACE PROCEDURE raise_salary
(p_id IN emp.empno%TYPE)
IS
BEGIN
IF p_id >= 7500 THEN
BEGIN
UPDATE emp
SET sal = sal * 1.15
WHERE empno = p_id;
END;
END IF;
IF p_id < 7500 THEN
BEGIN
UPDATE emp
SET sal = sal * 1.10
WHERE empno = p_id;
END;
END IF;
END raise_salary;
--注意:
--1.end、end if 、end 過程名 後一定要加;號
--2.if裏面的begin end 可以省略
--3.update執行語句後加;號
--4.emp.empno%TYPE 表示與emp表裏的empno列數據類型相同
--整理後
CREATE OR REPLACE PROCEDURE raise_salary
(p_id IN number)
IS
BEGIN
IF p_id >= 7500 THEN
UPDATE emp
SET sal = sal * 1.15
WHERE empno = p_id;
else
UPDATE emp
SET sal = sal * 1.10
WHERE empno = p_id;
END IF;
END raise_salary;
--調用過程
--通過PL/SQL Dev查看Procedures文件夾,右鍵點擊raise_salary過程,選擇“Test”,在彈出的窗口中對應p_id這個形參輸入實參然後選中彈出窗口中的代碼進行執行即可
---------------------------------------------------------------------------
--創建函數
--創建函數的語法形式如下
CREATE [OR REPLACE] FUNCTION fname
[ (param1 [mode1] type1,
param2 [mode2] type2,
…)]
RETURN type //這一行後不能加;號
IS | AS
[variable1 type3 :=0;
variable2 type4 :=0;]
BEGIN
PL/SQL Block
END [fname]
--注意:
--1.end、end if 、end 過程名 後一定要加;號
--例1:假設要創建一個通過員工號獲取上級管理者編號的函數,其SQL語句如下
CREATE OR REPLACE FUNCTION get_mgr_id
(p_id IN number)
RETURN NUMBER
IS
v_mgr_id number :=0;
BEGIN
SELECT mgr INTO v_mgr_id
FROM emp WHERE empno = p_id;
RETURN v_mgr_id;
END get_mgr_id;
--例2:函數功能:判斷一個數是否能整除另一個數,可以返回1,不可以返回0
CREATE OR REPLACE FUNCTION division
(divisor IN number,
dividend IN number)
RETURN NUMBER
IS
BEGIN
IF mod(divisor,dividend)=0 then
RETURN 1;
ELSE
RETURN 0;
END IF;
END division;
----------------------------------------------------------------------------------------------------------------------------
--函數與過程的區別
--1.函數多用於計算,過程用於執行特定的任務
--2.函數聲明爲FUNCTION,過程聲明爲PROCEDURE
--3.函數需要描述返回類型,並且PL/SQL語句塊中至少有一個有效的RETURN語句;過程無返回值,可通過輸出參數返回多個值
--4.函數不能獨立運行,過程可作爲一個獨立的PL/SQL語句運行
--5.在DML和DQL中可以調用函數,但不能調用過程