PL/SQL - 函數:初學者指南
你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入 PL/SQL 函數的世界。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導遊,我們會一步步來。到了這個教學的結尾,你將能夠像專業人士一樣創建和調用函數!
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;
/
別讓這個嚇到你!讓我們分解一下:
-
CREATE [OR REPLACE] FUNCTION
:這告訴 Oracle 我們想要創建一個新的函數(或替換一個現有的)。 -
function_name
:這是我們給函數的名字。 -
(parameter_name [IN | OUT | IN OUT] type [, ...])
:這是我們函數接受的輸入。 -
RETURN return_datatype
:這指定了我們函數將回傳的數據類型。 -
IS
:這個關鍵字將函數頭與函數身體分隔開。 -
BEGIN
和END
鍵將我們函數的主要代碼包起來。 -
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;
/
這個函數中發生了什麼:
- 我們創建了一個名為
calculate_circle_area
的函數。 - 它接受一個輸入參數:
radius
,它是一個 NUMBER。 - 它將回傳一個 NUMBER(圓的面積)。
- 我們定義了一個常量
pi
及其值。 - 我們使用公式 π * r^2 計算面積。
- 最後,我們回傳計算出的面積。
調用函數
現在,我們已經創建了函數,我們如何使用它?這被稱為“調用”函數。在 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;
/
讓我們分解一下:
- 如果 n 等於 0 或 1,我們回傳 1(這是我們的基本情況)。
- 否則,我們將 n 邊乘以 (n-1) 的階乘。
- 這個函數不斷地調用自身,直到達到基本情況。
使用這個函數:
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