子程序就是能夠接受參數並被其他程序所調用的命名PL/SQL塊。PL/SQL子程序有兩種類型,過程和函 數。通俗地講,過程用於執行一個操作,而函數用於返回一個結果值。同匿名PL/SQL塊類似,子程序也 有聲明部分,執行部分和一個可選的異常處理部分,聲明部分包含類型、游標、常量、變量、異常和嵌 套子程序的聲明。這些內容都針對當前的子程序有效,也就是說在子程序退出時聲明的這些內容會自動 失效。執行部分包含賦值語句、流程控制語句和Oracle的數據操作語句。異常處理部分包含異常處理程 序。
一、過程 (存儲過程)
過程是一個能執行某個特定操作的子程序。使用CREATE OR REPLACE創建或者替換保存在數據庫中的一個子程序。
示例1:聲明存儲過程,該過程返回dept表 行數
DECLARE
PROCEDURE getDeptCount
AS
deptCount INT;
BEGIN
SELECT COUNT(*) INTO deptCount FROM DEPT;
DBMS_OUTPUT.PUT_LINE('DEPT 表的共有記錄數:'||deptCount);
END getDeptCount;
BEGIN
getDeptCount [()];
END;
注意:此存儲過程getDeptCount只在塊運行時有效。
示例2:創 建不帶參數的存儲過程,該過程返回dept表行數
CREATE OR REPLACE PROCEDURE getDeptCount
AS | IS
deptCount int;
BEGIN
SELECT COUNT(*) INTO deptCount FROM dept;
DBMS_OUTPUT.PUT_LINE('dept表共有'||deptCount||'行記錄 ');
END [getDeptCount];
當我們創建的存儲過程沒有參數時,在存儲過程名 字後面不能有括號。在AS或者IS後至BEGIN之前是聲明部分,存儲過程中的聲明不使用DECLARE關鍵字。 同匿名PL/SQL塊一樣,EXCEPTION和聲明部分都是可選的。
當我們創建的過程帶有錯誤時,我們 可以通過SELECT * FROM USER_ERRORS查看,或者使用SHOW ERRORS [ PROCEDURE Proc_Name]查看。
使用以下代碼可以執行存儲過程:
BEGIN
getDeptCount;
END;
以上存儲過程還可以通過以下代碼來簡化調用:
EXEC getDeptCount[;]
CALL getDeptCount();
注意:
並不是所有的存 儲過程都可以用這種方式來調用
定義無參存儲過程時,存儲過程名後不能加()
在塊中或 是通過EXEC調用存儲過程時可以省略()
通過CALL調用無參存儲過程必須加上()
示例3:創 建帶有輸入參數的存儲過程,該過程通過員工編號打印工資額
CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo NUMBER) --參數的數據類型不能指定長度
AS
salary emp.sal%TYPE;
BEGIN
SELECT SAL INTO salary FROM EMP WHERE EMPNO=eNo;
DBMS_OUTPUT.PUT_LINE(eNo||'號員工的工資為'||salary);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('沒有找到該編號的員工');
END;