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