(6)Oracle——————PL/SQL的基本語法,記錄類型和流程控制語句

1,PL/SQL的基本語法

2,記錄類型

3,流程控制語句

PL/SQL的基本語法

1,什麼是 PL/SQL?
  • PL/SQL 是 Procedure Language & Structured Query Language 的縮寫PL/SQL是對 SQL 語言存儲過程語言的擴展,它現在已經成爲一種過程處理語言
  • PL/SQL 是 是 ORACLE 系統的核心語言,現在 ORACLE 的許多部件都是由 PL/SQL 寫成。在 PL/SQL 中可以使用的 SQL 語句有:
    INSERT,UPDATE,DELETE,SELECT … INTO,COMMIT,ROLLBACK,SAVEPOINT。
  • 提示:在 PL/SQL 中只能用 SQL 語句中的 DML 部分,不能用 DDL 部分,如果要在 PL/SQL 中使用 DDL( 如CREATE table 等 ) 的話,只能以動態的方式來使用。
2,PL/SQL 塊結構和組成元素
  • PL/SQL 程序由三個塊組成,即聲明部分、執行部分、異常處理部分
  • PL/SQL 塊的結構如下:
DECLARE
/*  聲明部分 :  在此聲明 PL/SQL 用到的變量 , 類型及遊標,以及局部的存儲過程和函數 */
BEGIN
/* 執行部分 : 過程及 SQL  語句 ,  即程序的主要部分 */
EXCEPTION
/*  執行異常部分 :  錯誤處理 */
END;
  • PL/SQL 塊可以分爲三類 :
    ①, 無名塊:動態構造,只能執行一次。
    ②,子程序:存儲在數據庫中的 存儲過程、函數及包等。當在數據庫上建立好後可以在其它程序中調用它們。
    ③,觸發器:當數據庫發生操作時,會觸發一些事件,從而自動執行相應的程序。

  • 建議的命名方法:
    在這裏插入圖片描述

記錄類型

  • 記錄類型是把 邏輯相關 的數據作爲一個單元存儲起來 ,稱作 PL/SQL RECORD 的域(FIELD) ,其作用是存放互不相同但邏輯相關的信息。
    在這裏插入圖片描述
  • DBMS_OUTPUT.PUT_LINE 過程的功能類似於 Java 中的 System.out.println() 直接將輸出結果送到標準輸出中
1,使用%TYPE
  • 定義一個變量,其數據類型與已經定義的某個 數據變量的類型相同,或者與數據庫表的某個列的數據類型相同,這時可以使用%TYPE。
  • 使用%TYPE 特性的優點在於:
    所引用的數據庫列的數據類型可以不必知道;
    所引用的數據庫列的數據類型可以實時改變。
    在這裏插入圖片描述
2,使用%ROWTYPE
  • PL/SQL 提供%ROWTYPE 操作符, 返回一個記錄類型, 其數據類型和數據庫表的數據結構相一致。
  • 使用%ROWTYPE 特性的優點在於:
    所引用的數據庫中列的個數和數據類型可以不必知道;
    所引用的數據庫中列的個數和數據類型可以實時改變。
    在這裏插入圖片描述
3,PL/SQL 表( 嵌套表)
  • PL/SQL 程序可使用嵌套表類型創建具有一個或多個列和無限行的變量, 這很像數據庫中的表. 聲明嵌套表類型的一般語法如下:
TYPE type_name IS TABLE OF
{datatype | {variable | table.column} % type | table%rowtype};

在這裏插入圖片描述

  • 說明:

①,在使用嵌套表之前必須先使用該集合的構造器初始化它. PL/SQL 自動提供一個帶有相同名字的構造器作爲集合類型.
②, 嵌套表可以有任意數量的行. 表的大小在必要時可動態地增加或減少: extend(x) 方法添加 x 個空元素到集合末尾; trim(x) 方法爲去掉集合末尾的 x 個元素.

4,賦值
  • 在 PL/SQL 編程中,變量賦值是一個值得注意的地方,它的語法如下:
variable := expression ;

variable 是一個 PL/SQL 變量, expression 是一個 PL/SQL 表達式.

  • 數據庫賦值
    數據庫賦值是 通過 SELECT 語句來完成的,每次執行 SELECT語句就賦值一次, 一般要求被賦值的變量與SELECT 中的列名要一一對應。如
DECLARE
emp_id emp.empno%TYPE :=7788;
emp_name emp.ename%TYPE;
wages emp.sal%TYPE;
BEGIN
SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages
FROM emp WHERE empno = emp_id;
DBMS_OUTPUT.PUT_LINE(emp_name||----‘||to_char(wages));
END;

PL/SQL 流程控制語句

  • PL/SQL 的流程控制語句, 包括如下三類:
    控制語句: IF 語句
    循環語句: LOOP 語句, EXIT 語句
    順序語句: GOTO 語句, NULL 語句
1,條件語句
IF <布爾表達式> THEN
PL/SQLSQL 語句;
END IF;
IF <布爾表達式> THEN
PL/SQLSQL 語句;
ELSE
其它語句;
END IF;
IF <布爾表達式> THEN
PL/SQLSQL 語句;
ELSIF < 其它布爾表達式> THEN
其它語句;
ELSIF < 其它布爾表達式> THEN
其它語句;
ELSE
其它語句;
END IF;
DECLARE
v_empno emp.empno%TYPE;
V_salary emp.sal%TYPE;
V_comment VARCHAR2(35);
BEGIN
SELECT sal INTO v_salary FROM emp WHERE empno=v_empno;
IF v_salary<1500 THEN
V_comment:= ‘Fairly less’;
ELSIF v_salary <3000 THEN
V_comment:= ‘A little more’;
ELSE
V_comment:= ‘Lots of salary’;
END IF;
DBMS_OUTPUT.PUT_LINE(V_comment);
END;
2,CASE表達式
DECLARE
V_grade char(1) ;
V_appraisal VARCHAR2(20);
BEGIN
V_appraisal :=
CASE v_grade
WHEN ‘A’ THEN ‘Excellent’
WHEN ‘B’ THEN ‘Very Good’
WHEN ‘C’ THEN ‘Good’
ELSENo such grade’
END;
DBMS_OUTPUT.PUT_LINE(‘Grade:‘||v_grade||’ Appraisal: ‘|| v_appraisal);
END;
3,循環
  • 簡單循環LOOP
DECLARE
int NUMBER(2) :=0;
BEGIN
LOOP
int := int + 1;
DBMS_OUTPUT.PUT_LINE('int 的當前值爲:'||int);
EXIT WHEN int =10;
END LOOP;
END;
  • WHILE 循環( 相較 LOOP推薦使用 )
DECLARE
x NUMBER :=1;
BEGIN
WHILE x<=10 LOOP
DBMS_OUTPUT.PUT_LINE('X 的當前值爲:'||x);
x:= x+1;
END LOOP;
END;
  • 數字式循環(每循環一次,循環變量自動加 1;使用關鍵字 REVERSE,循環變量自動減 1。跟在 IN REVERSE 後面的數字必須是從小到大的順序, 而且必須是整數,不能是變量或表達式。可以使用 EXIT 退出循環。)
BEGIN
FOR int in 1..10 LOOP
DBMS_OUTPUT.PUT_LINE('int 的當前值爲: '||int);
END LOOP;
END;
  • 標號和 GOTO(PL/SQL 中 GOTO 語句是無條件跳轉到指定的標號去的意思)
DECLARE
V_counter NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('V_counter 的當前值爲:'||V_counter);
V_counter := v_counter + 1;
IF v_counter > 10 THEN
GOTO l_ENDofLOOP;
END IF;
END LOOP;
<<l_ENDofLOOP>>
DBMS_OUTPUT.PUT_LINE('V_counter 的當前值爲:'||V_counter);
END ;

下一章,(7)Oracle——————遊標的使用,異常錯誤處理,存儲過程和觸發器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章