最近因爲對Oracle比較感興趣,所以打算深入學習一下PL/SQL,後期打算再學習一下Oracle ERP,正好有機會進到這個項目團隊,正好可以跟老鳥門學習一下,下面是我的學習經歷和筆記
PL/SQL塊結構
DECLARE
/*
* 定義部分-定義常量、變量、複雜數據類型、遊標、例解
*/
BEGIN
/*
* 執行部分-PL/SQL語句和SQL語句
*/
EXCEPTION
/*
* 例外處理部分-處理運行錯誤
*/
END; /* 塊結束標記*/
定義部分DECLARE是可選的,執行部分以BEGIN開始,是必須的,例外處理部分以EXCEPTION開始,該部分是可選的,而END是PL/SQL塊的結束標記
PL/SQL塊分類 :可以分爲匿名塊和命名塊,匿名塊可以內嵌到應用程序中,也可以在交互環境使用。命名塊是具有特定標識的PL/SQL塊,命名塊和匿名塊非常相似,只不過在PL/SQL塊前加以<<>>標記,當使用嵌入時,爲了區分多級嵌套曾次關係,可以使用命名塊加以區分。
子程序
子程序包括過程,函數,包。既可以開發客戶端的子程序,也可以開發服務器端的子程序,客戶端主要用在Developer中,而服務器子程序可以用在任何應用程序中,通過將商業邏輯和企業規則集成到PL/SQL子程序中。
過程 :是用於執行特定操作,當建立過程時,既可以指定輸入參數(IN),也可以指定輸出參數(OUT)。通過在過程中使用輸入參數,可以將應用環境的數據傳遞到執行部分;通過使用輸出參數,可以將執行部分的數據傳遞到應用環境。在SQL*PLUS中可以使用CREATE PROCEDURE命令建立過程。
eg:
CREATE PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal
WHERE lower(ename) = lower(name);
END;
SQL>exec update_sal('scott',2000);
SQL>call update_sal('scott',2000);
函數 :用於返回特定數據,當建立函數時,在函數頭部必須包含RETURN子句,而在函數體內必須要包含RETURN語句返回數據。在SQL*PLUS中可以使用CREATE FUNCTION命令建立函數。
eg:
CREATE FUNCTION annual_income(name VARCHAR2)
RETURN NUMBER IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
SQL>VAR income NUMBER
SQL>CALL annual_income('scott') INTO :income
SQL>PRINT income
包 :用於邏輯組合相關的過程和函數,它由包規範和包體兩部分組成。包規範用於定義公用的常量、變量、過程和函數,在SQL*PLUS中可以使用CREATE PACKAGE命令建立包規範,使用CREATE PACKAGE BODY命令建立包體。
eg:
CREATE PACKAGE emp_pkg IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER;
END;
CREATE PACKAGE BODY emp_pkg IS
CREATE PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal
WHERE lower(ename) = lower(name);
END;
CREATE FUNCTION annual_income(name VARCHAR2)
RETURN NUMBER IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
END;
調用包的過程和函數時,在過程和函數名之前必須要帶有包名作爲前綴(包名.子程序名),如果要訪問其他方案的包,還必須加方案作爲前綴(方案名.包名.子程序名)
SQL>call emp_pkg.update_sal('scott',1500);
SQL>VAR income NUMBER;
SQL>call emp_pkg.annual_income('scott') INTO :income;
SQL>PRINT income
觸發器 :是用於隱含執行的存儲過程,當定義觸發器時,必須要觸發事件和觸發操作,常用的觸發事件包括INSERT、UPDATE、DELETE語句,而出發操作實際是一個PL/SQL塊,在SQL*PLUS中,可以使用CREATE TRIGGER命令來完成。
PL/SQL數據類型:在編寫PL/SQL程序時,可以使用標量類型、複合類型、參照類型、LOB類型。