PL/SQL - 函數:初學者指南

你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入 PL/SQL 函數的世界。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導遊,我們會一步步來。到了這個教學的結尾,你將能夠像專業人士一樣創建和調用函數!

PL/SQL - Functions

PL/SQL 函數是什麼?

在我們深入之前,讓我們先了解函數是什麼。將函數視為你代碼中的小助手。它就像是你主程序中的一個小型程序,用以執行特定的任務。你給它一些信息(我們稱之為輸入或參數),它進行一些工作,然後回傳一個結果。

舉個例子,想像你有一個可以計算圓面積的機器人助手(我們稱之為 FunctionBot)。你告訴 FunctionBot 圓的半徑,它快速地計算並告訴你面積。這就是程式設計中函數所做的!

創建函數

現在,讓我們學習如何在 PL/SQL 中創建我們自己的函數。基本結構如下:

CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype
IS
-- 宣告部分
BEGIN
-- 可執行部分
RETURN (value);
END;
/

別讓這個嚇到你!讓我們分解一下:

  1. CREATE [OR REPLACE] FUNCTION:這告訴 Oracle 我們想要創建一個新的函數(或替換一個現有的)。
  2. function_name:這是我們給函數的名字。
  3. (parameter_name [IN | OUT | IN OUT] type [, ...]):這是我們函數接受的輸入。
  4. RETURN return_datatype:這指定了我們函數將回傳的數據類型。
  5. IS:這個關鍵字將函數頭與函數身體分隔開。
  6. BEGINEND 鍵將我們函數的主要代碼包起來。
  7. RETURN (value):這是我們指定函數應該回傳什麼的地方。

讓我們創建一個計算圓面積的簡單函數:

CREATE OR REPLACE FUNCTION calculate_circle_area(radius NUMBER)
RETURN NUMBER
IS
pi CONSTANT NUMBER := 3.14159265359;
area NUMBER;
BEGIN
area := pi * radius * radius;
RETURN area;
END;
/

這個函數中發生了什麼:

  1. 我們創建了一個名為 calculate_circle_area 的函數。
  2. 它接受一個輸入參數:radius,它是一個 NUMBER。
  3. 它將回傳一個 NUMBER(圓的面積)。
  4. 我們定義了一個常量 pi 及其值。
  5. 我們使用公式 π * r^2 計算面積。
  6. 最後,我們回傳計算出的面積。

調用函數

現在,我們已經創建了函數,我們如何使用它?這被稱為“調用”函數。在 PL/SQL 中,你可以通過以下幾種方式調用函數:

1. 在 SELECT 語句中:

SELECT calculate_circle_area(5) AS circle_area FROM DUAL;

這將回傳半徑為 5 的圓的面積。

2. 在 PL/SQL 區塊中:

DECLARE
result NUMBER;
BEGIN
result := calculate_circle_area(7);
DBMS_OUTPUT.PUT_LINE('圓的面積是: ' || result);
END;
/

這將計算半徑為 7 的圓的面積並打印結果。

3. 作為更大表達式的一部分:

DECLARE
radius NUMBER := 10;
diameter NUMBER;
BEGIN
diameter := 2 * radius;
DBMS_OUTPUT.PUT_LINE('直徑為 ' || diameter || ' 的圓的面積是: ' ||
calculate_circle_area(radius));
END;
/

這計算直徑並使用我們的函數來找到面積。

PL/SQL 遞歸函數

現在,讓我們來討論一些更先進的概念:遞歸函數。遞歸函數是一個調用自身的函數。這就像一個俄羅斯套娃——打開一個,裡面還有一個!

這裡有一個經典的例子:計算數字的階乘。數字 5 的階乘(寫作 5!)是 5 4 3 2 1 = 120。

讓我們寫一個遞歸函數來計算階乘:

CREATE OR REPLACE FUNCTION factorial(n NUMBER)
RETURN NUMBER
IS
BEGIN
IF n = 0 OR n = 1 THEN
RETURN 1;
ELSE
RETURN n * factorial(n - 1);
END IF;
END;
/

讓我們分解一下:

  1. 如果 n 等於 0 或 1,我們回傳 1(這是我們的基本情況)。
  2. 否則,我們將 n 邊乘以 (n-1) 的階乘。
  3. 這個函數不斷地調用自身,直到達到基本情況。

使用這個函數:

BEGIN
DBMS_OUTPUT.PUT_LINE('5 的階乘是: ' || factorial(5));
END;
/

這將輸出:"5 的階乘是: 120"

常見 PL/SQL 函數方法

這裡有一個表,列出了與 PL/SQL 函數一起使用的一些常見方法:

方法 描述 示例
CREATE FUNCTION 創建一個新函數 CREATE FUNCTION my_func...
REPLACE FUNCTION 替換一個現有函數 CREATE OR REPLACE FUNCTION my_func...
RETURN 指定回傳類型和值 RETURN NUMBER; ... RETURN result;
CALL 調用函數 SELECT my_func(5) FROM DUAL;
DROP FUNCTION 移除函數 DROP FUNCTION my_func;
EXECUTE 執行函數 EXECUTE my_func(10);

記住,熟能生巧!不要害怕嘗試這些函數。嘗試更改輸入,組合函數,或創建有你自己特色的函數。你越多地與它們交互,你就越能理解它們是如何工作的。

那就這樣吧!你已經踏出了進入 PL/SQL 函數世界的第一步。從創建簡單計算器到遞歸問題解決者,函數是讓你的代碼更高效、更易於管理的強大工具。持續探索,持續編程,最重要的是,玩得開心!

Credits: Image by storyset