PL/SQL - 數據類型

Hello, 有志者們!今天,我們將深入PL/SQL數據類型的迷人世界。別擔心你對編程還是新手;我會一步一步地引導你。在本教程結束時,你將能夠熟悉PL/SQL中的各種數據類型,並準備好開始你的編碼冒險!

PL/SQL - Data Types

PL/SQL 數據類型與子類型

讓我們從基礎開始。在PL/SQL中,標量數據類型是我們程序的建築塊。它們代表單一值,如數字或文本。

標量數據類型是什麼?

標量數據類型是PL/SQL中最簡單形式的数据。它們就像我們編程宇宙中的原子——小而不可分割的單位,我們用它們來构建更複雜的結構。

以下是一個簡單的例子來說明標量數據類型:

DECLARE
my_name VARCHAR2(50) := 'John Doe';
BEGIN
DBMS_OUTPUT.PUT_LINE('My name is: ' || my_name);
END;

在這個例子中,my_name 是一個 VARCHAR2 數據類型的變量,用於存儲文本。我們給它賦予了值 'John Doe'。當我們運行這段代碼時,它將輸出:"My name is: John Doe"。

PL/SQL 數字數據類型與子類型

現在,讓我們來谈谈數字。PL/SQL 提供了多種數字數據類型來處理不同類型的數字。

常見數字數據類型

數據類型 描述 示例
NUMBER 常規用途數字 NUMBER(10,2)
INTEGER 整數 INTEGER
BINARY_FLOAT 32位浮點數 BINARY_FLOAT
BINARY_DOUBLE 64位浮點數 BINARY_DOUBLE

讓我們看看這些數據類型的應用:

DECLARE
my_integer INTEGER := 42;
my_float BINARY_FLOAT := 3.14;
my_salary NUMBER(8,2) := 5000.50;
BEGIN
DBMS_OUTPUT.PUT_LINE('The answer is: ' || my_integer);
DBMS_OUTPUT.PUT_LINE('Pi is approximately: ' || my_float);
DBMS_OUTPUT.PUT_LINE('My salary is: $' || my_salary);
END;

這段腳本聲明了三個不同數字類型的變量。my_salaryNUMBER(8,2) 類型意味著它可以存儲最多8位數字,其中包括小數點後的2位。

PL/SQL 字符數據類型與子類型

文本數據在編程中至關重要。PL/SQL 提供了多種字符數據類型以有效地處理文本。

常見字符數據類型

數據類型 描述 示例
VARCHAR2 可變長度字符字符串 VARCHAR2(100)
CHAR 固定長度字符字符串 CHAR(10)
NVARCHAR2 可變長度unicode字符串 NVARCHAR2(100)
NCHAR 固定長度unicode字符串 NCHAR(10)

以下是如何在實踐中應用這些類型:

DECLARE
my_varchar VARCHAR2(50) := 'Hello, World!';
my_char CHAR(10) := 'Fixed     ';
my_nvarchar NVARCHAR2(50) := N'こんにちは'; -- 日語 "Hello"
BEGIN
DBMS_OUTPUT.PUT_LINE('VARCHAR2: ' || my_varchar);
DBMS_OUTPUT.PUT_LINE('CHAR: ' || my_char || '(end)');
DBMS_OUTPUT.PUT_LINE('NVARCHAR2: ' || my_nvarchar);
END;

注意 CHAR 類型如何用空格填充字符串以滿足其固定長度。

PL/SQL 布爾數據類型

布爾數據類型對於我們程序中的決策至關重要。它們只能有三個可能的值:TRUE、FALSE 或 NULL。

DECLARE
is_student BOOLEAN := TRUE;
has_job BOOLEAN := FALSE;
is_married BOOLEAN;
BEGIN
IF is_student THEN
DBMS_OUTPUT.PUT_LINE('This person is a student.');
END IF;

IF NOT has_job THEN
DBMS_OUTPUT.PUT_LINE('This person does not have a job.');
END IF;

IF is_married IS NULL THEN
DBMS_OUTPUT.PUT_LINE('We don''t know if this person is married.');
END IF;
END;

這段腳本演示了我們如何使用布爾值在代碼中進行決策。

PL/SQL 日期時間和間隔類型

當處理日期和時間時,PL/SQL 提供了特定的數據類型以準確地處理這些值。

常見日期時間類型

數據類型 描述 示例
DATE 日期和時間 DATE
TIMESTAMP 日期和時間帶小數秒 TIMESTAMP
INTERVAL YEAR TO MONTH 以年和月為週期的時間間隔 INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND 以天、小時、分鐘和秒為週期的時間間隔 INTERVAL DAY TO SECOND

讓我們看看這些類型的應用:

DECLARE
current_date DATE := SYSDATE;
future_date TIMESTAMP := SYSTIMESTAMP + INTERVAL '1' YEAR;
age_interval INTERVAL YEAR TO MONTH;
BEGIN
age_interval := (SYSDATE - TO_DATE('1990-01-01', 'YYYY-MM-DD')) YEAR TO MONTH;

DBMS_OUTPUT.PUT_LINE('Current date: ' || TO_CHAR(current_date, 'DD-MON-YYYY'));
DBMS_OUTPUT.PUT_LINE('Date after 1 year: ' || TO_CHAR(future_date, 'DD-MON-YYYY HH24:MI:SS.FF'));
DBMS_OUTPUT.PUT_LINE('Age: ' || age_interval);
END;

這段腳本演示了如何處理日期、時間戳和間隔。

PL/SQL 大型對象(LOB)數據類型

對於處理大量數據,PL/SQL 提供了LOB(大型對象)數據類型。

常見LOB類型

數據類型 描述 示例
CLOB 字符大型對象 CLOB
BLOB 二进制大型对象 BLOB
NCLOB 國家字符大型對象 NCLOB

以下是一個使用CLOB的簡單示例:

DECLARE
my_clob CLOB;
BEGIN
my_clob := 'This is a very long string that could potentially be several megabytes in size.';
DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(my_clob) || ' characters long');
END;

這段腳本創建了一個CLOB並演示了如何獲取其長度。

PL/SQL 用戶定義子類型

PL/SQL 允許你基於現有的數據類型創建自己的子類型。這可以幫助你的代碼更加易讀和可維護。

DECLARE
SUBTYPE positive_number IS NUMBER(8,2) CHECK (positive_number > 0);
my_salary positive_number;
BEGIN
my_salary := 5000.50;
DBMS_OUTPUT.PUT_LINE('My salary: $' || my_salary);

-- 這將引發錯誤:
-- my_salary := -1000;
END;

在這個例子中,我們創建了一個子類型 positive_number,它確保值始終為正。

PL/SQL 中的 NULL 值

最後,讓我們來談談 NULL 值。在PL/SQL中,NULL 表示未知或不可用的值。它與零或空字符串不同。

DECLARE
var1 NUMBER;
var2 VARCHAR2(10) := '';
BEGIN
IF var1 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('var1 is NULL');
END IF;

IF var2 IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('var2 is not NULL, it''s an empty string');
END IF;
END;

這段腳本演示了NULL和空字符串之間的差異。

這就是它!我們已經介紹了PL/SQL中的主要數據類型。記住,理解數據類型對於編寫高效且無錯誤的代碼至關重要。持續練習,很快你將成為PL/SQL的高手!

Credits: Image by storyset