PL/SQL - 基本語法

歡迎,未來的程序员!今天,我們將深入PL/SQL的精彩世界。如果你以前從未寫過一行代碼,也不用擔心 - 我們將從頭開始,逐步建立你的知識。在本教程結束時,你將能夠自信地編寫你的第一個PL/SQL程序!

PL/SQL - Basic Syntax

「Hello World」範例

讓我們從傳統的「Hello World」程序開始。這是每個程序員的必經之路,也是我們讓雙腳濕潑PL/SQL語法的絕佳方式。

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/

讓我們來解析這段代碼:

  1. BEGIN:這個關鍵字標誌著我們PL/SQL區块的開始。
  2. DBMS_OUTPUT.PUT_LINE('Hello, World!');:這行代碼打印我們的消息。把它看作是PL/SQL與我們交談的方式。
  3. END;:這標誌著我們PL/SQL區块的結尾。
  4. /:這個前向斜杠告訴SQL*Plus執行PL/SQL區块。

當你運行這段代碼時,你會在螢幕上看到「Hello, World!」。恭喜!你剛剛寫出了你的第一個PL/SQL程序。

PL/SQL標識符

標識符是我們給程序元素(如變量、過程、函數)命名的。它們就像我們代碼不同部分的名牌。以下是如何創建標識符的規則:

  1. 必須以字母開頭(A-Z或a-z)
  2. 可以跟隨字母、數字(0-9)、美元符號($)、下劃線(_)或鋪號(#)
  3. 不能超過30個字符
  4. 不能是保留字(如BEGIN、END、IF等)

讓我們看一些例子:

DECLARE
employee_name VARCHAR2(50);
salary NUMBER;
dept_id NUMBER(5);
BEGIN
-- 代碼寫在這裡
END;
/

在這個例子中,employee_namesalarydept_id都是有效的標識符。

PL/SQL分隔符

分隔符是在PL/SQL中具有特定含義的特殊字符或符號。它們就像句子中的標點符號,幫助我們結構化和分隔代碼的不同部分。

以下是一些常見的PL/SQL分隔符:

分隔符 描述
; 說明終止符
% 屬性指示符
. 成分選擇器
( ) 包含參數列表
, 參數分隔符
:= 賦值運算符
=> 關聯運算符
-- 單行評論指示符
/ / 多行評論指示符

讓我們看看一些實際應用的例子:

DECLARE
v_count NUMBER := 0; -- 賦值運算符
v_name VARCHAR2(50) := 'John Doe';
BEGIN
v_count := v_count + 1; -- 說明終止符
DBMS_OUTPUT.PUT_LINE('Name: ' || v_name); -- 成分選擇器
END;
/

PL/SQL評論

評論就像代碼中的便利貼紙。它們被編譯器忽略,但對於解釋你的代碼是什麼非常有用。在PL/SQL中有兩種類型的評論:

  1. 單行評論:以--開頭
  2. 多行評論:包含在/**/之間

以下是一個例子:

DECLARE
-- 這是一個單行評論
v_pi NUMBER := 3.14159;
BEGIN
/*
這是一個多行評論。
它可以跨越多行。
非常有用於長篇解釋。
*/
DBMS_OUTPUT.PUT_LINE('pi的值是: ' || v_pi);
END;
/

PL/SQL程序單元

PL/SQL程序單元是PL/SQL應用的建築塊。它們就像烹飪書中的食譜 - 每個都描述了如何執行一個特定的任務。主要類型有:

  1. 匿名區块
  2. 過程
  3. 函數
  4. 套件

讓我們看看每個的例子:

1. 匿名區块

我們已經在「Hello World」範例中見過這個。它是一段未保存到數據庫中的代碼。

BEGIN
DBMS_OUTPUT.PUT_LINE('這是一個匿名區块');
END;
/

2. 過程

過程是一個命名的PL/SQL區块,它執行一個特定的動作。

CREATE OR REPLACE PROCEDURE greet_user(p_name IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, ' || p_name || '!');
END;
/

-- 調用過程:
BEGIN
greet_user('Alice');
END;
/

3. 函數

函數與過程相似,但它返回一個值。

CREATE OR REPLACE FUNCTION calculate_area(p_radius IN NUMBER)
RETURN NUMBER IS
v_pi CONSTANT NUMBER := 3.14159;
BEGIN
RETURN v_pi * p_radius * p_radius;
END;
/

-- 使用函數:
DECLARE
v_area NUMBER;
BEGIN
v_area := calculate_area(5);
DBMS_OUTPUT.PUT_LINE('面積是: ' || v_area);
END;
/

4. 套件

套件是一組相關的過程、函數、變量和其他PL/SQL對象的集合。

CREATE OR REPLACE PACKAGE math_operations AS
FUNCTION add_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER;
FUNCTION subtract_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER;
END math_operations;
/

CREATE OR REPLACE PACKAGE BODY math_operations AS
FUNCTION add_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN a + b;
END add_numbers;

FUNCTION subtract_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN a - b;
END subtract_numbers;
END math_operations;
/

-- 使用套件:
DECLARE
v_result NUMBER;
BEGIN
v_result := math_operations.add_numbers(10, 5);
DBMS_OUTPUT.PUT_LINE('10 + 5 = ' || v_result);

v_result := math_operations.subtract_numbers(10, 5);
DBMS_OUTPUT.PUT_LINE('10 - 5 = ' || v_result);
END;
/

這就是全部!我們已經介紹了PL/SQL的基本語法,從簡單的「Hello World」程序到更複雜的結構,如套件。記住,學習編程就像學習一門新語言 - 它需要練習和耐心。不要害怕嘗試代碼範例,修改它們,並觀察結果。這樣,你才能真正內化這些概念,並成為一個熟的PL/SQL程序员。

開心編程,願你的查詢總是返回你期望的結果!

Credits: Image by storyset