PL/SQL - Loại dữ liệu

Xin chào, những người học lập trình! Hôm nay, chúng ta sẽ khám phá thế giới kỳ diệu của các loại dữ liệu PL/SQL. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước trong hành trình này. Cuối cùng của bài hướng dẫn này, bạn sẽ cảm thấy thoải mái với các loại dữ liệu trong PL/SQL và sẵn sàng bắt đầu hành trình lập код của mình!

PL/SQL - Data Types

Loại dữ liệu vô hướng và các subtype trong PL/SQL

Hãy bắt đầu từ những điều cơ bản. Trong PL/SQL, các loại dữ liệu vô hướng là những viên gạch xây dựng của các chương trình chúng ta. Chúng đại diện cho các giá trị đơn lẻ, như số hoặc văn bản.

Loại dữ liệu vô hướng là gì?

Loại dữ liệu vô hướng là hình thức đơn giản nhất của dữ liệu trong PL/SQL. Chúng giống như các nguyên tử trong vũ trụ lập trình của chúng ta - những đơn vị nhỏ, không thể chia nhỏ được mà chúng ta sử dụng để xây dựng các cấu trúc phức tạp hơn.

Dưới đây là một ví dụ đơn giản để minh họa một loại dữ liệu vô hướng:

DECLARE
my_name VARCHAR2(50) := 'John Doe';
BEGIN
DBMS_OUTPUT.PUT_LINE('Tên của tôi là: ' || my_name);
END;

Trong ví dụ này, my_name là một biến của loại dữ liệu VARCHAR2, được sử dụng để lưu trữ văn bản. Chúng ta đã gán giá trị 'John Doe' cho nó. Khi chạy đoạn mã này, nó sẽ hiển thị: "Tên của tôi là: John Doe".

Loại dữ liệu số và các subtype trong PL/SQL

Bây giờ, hãy nói về các số. PL/SQL có nhiều loại dữ liệu số để xử lý các loại số khác nhau.

Các loại dữ liệu số phổ biến

Loại dữ liệu Mô tả Ví dụ
NUMBER Số mục đích tổng quát NUMBER(10,2)
INTEGER Số nguyên INTEGER
BINARY_FLOAT Số dấu phẩy động 32-bit BINARY_FLOAT
BINARY_DOUBLE Số dấu phẩy động 64-bit BINARY_DOUBLE

Hãy xem chúng trong hành động:

DECLARE
my_integer INTEGER := 42;
my_float BINARY_FLOAT := 3.14;
my_salary NUMBER(8,2) := 5000.50;
BEGIN
DBMS_OUTPUT.PUT_LINE('Câu trả lời là: ' || my_integer);
DBMS_OUTPUT.PUT_LINE('Pi ước tính là: ' || my_float);
DBMS_OUTPUT.PUT_LINE('Mức lương của tôi là: $' || my_salary);
END;

Đoạn mã này khai báo ba biến với các loại số khác nhau. Loại NUMBER(8,2) cho my_salary có nghĩa là nó có thể lưu trữ tối đa 8 chữ số, trong đó có 2 chữ số sau dấu phẩy động.

Loại dữ liệu ký tự và các subtype trong PL/SQL

Dữ liệu văn bản rất quan trọng trong lập trình. PL/SQL cung cấp nhiều loại dữ liệu ký tự để xử lý văn bản một cách hiệu quả.

Các loại dữ liệu ký tự phổ biến

Loại dữ liệu Mô tả Ví dụ
VARCHAR2 Chuỗi ký tự có độ dài thay đổi VARCHAR2(100)
CHAR Chuỗi ký tự có độ dài cố định CHAR(10)
NVARCHAR2 Chuỗi ký tự Unicode có độ dài thay đổi NVARCHAR2(100)
NCHAR Chuỗi ký tự Unicode có độ dài cố định NCHAR(10)

Dưới đây là cách chúng ta sử dụng chúng trong thực tế:

DECLARE
my_varchar VARCHAR2(50) := 'Hello, World!';
my_char CHAR(10) := 'Fixed     ';
my_nvarchar NVARCHAR2(50) := N'こんにちは'; -- "Hello" bằng tiếng Nhật
BEGIN
DBMS_OUTPUT.PUT_LINE('VARCHAR2: ' || my_varchar);
DBMS_OUTPUT.PUT_LINE('CHAR: ' || my_char || '(cuối)');
DBMS_OUTPUT.PUT_LINE('NVARCHAR2: ' || my_nvarchar);
END;

Lưu ý cách loại CHAR thêm các khoảng trống để làm đầy độ dài cố định của nó.

Loại dữ liệu Boolean trong PL/SQL

Loại dữ liệu Boolean rất quan trọng để ra quyết định trong các chương trình của chúng ta. Chúng có thể chỉ có ba giá trị có thể: TRUE, FALSE hoặc NULL.

DECLARE
is_student BOOLEAN := TRUE;
has_job BOOLEAN := FALSE;
is_married BOOLEAN;
BEGIN
IF is_student THEN
DBMS_OUTPUT.PUT_LINE('Người này là sinh viên.');
END IF;

IF NOT has_job THEN
DBMS_OUTPUT.PUT_LINE('Người này không có việc làm.');
END IF;

IF is_married IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Chúng ta không biết liệu người này có kết hôn hay không.');
END IF;
END;

Đoạn mã này minh họa cách chúng ta sử dụng các giá trị Boolean để ra quyết định trong mã của mình.

Loại dữ liệu ngày và khoảng thời gian trong PL/SQL

Khi làm việc với ngày và thời gian, PL/SQL cung cấp các loại dữ liệu cụ thể để xử lý các giá trị này chính xác.

Các loại dữ liệu ngày phổ biến

Loại dữ liệu Mô tả Ví dụ
DATE Ngày và thời gian DATE
TIMESTAMP Ngày và thời gian với giây phần TIMESTAMP
INTERVAL YEAR TO MONTH Khoảng thời gian theo năm và tháng INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND Khoảng thời gian theo ngày, giờ, phút và giây INTERVAL DAY TO SECOND

Hãy xem chúng trong hành động:

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('Ngày hiện tại: ' || TO_CHAR(current_date, 'DD-MM-YYYY'));
DBMS_OUTPUT.PUT_LINE('Ngày sau 1 năm: ' || TO_CHAR(future_date, 'DD-MM-YYYY HH24:MI:SS.FF'));
DBMS_OUTPUT.PUT_LINE('Tuổi: ' || age_interval);
END;

Đoạn mã này minh họa cách làm việc với ngày, timestamp và khoảng thời gian.

Loại dữ liệu đối tượng lớn (LOB) trong PL/SQL

Để xử lý lượng dữ liệu lớn, PL/SQL cung cấp các loại dữ liệu LOB (Large Object).

Các loại dữ liệu LOB phổ biến

Loại dữ liệu Mô tả Ví dụ
CLOB Đối tượng văn bản lớn CLOB
BLOB Đối tượng nhị phân lớn BLOB
NCLOB Đối tượng ký tự quốc gia lớn NCLOB

Dưới đây là một ví dụ đơn giản về việc sử dụng 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) || ' ký tự dài');
END;

Đoạn mã này tạo một CLOB và minh họa cách lấy độ dài của nó.

Loại dữ liệu được xác định bởi người dùng trong PL/SQL

PL/SQL cho phép bạn tạo các subtype dựa trên các loại dữ liệu hiện có. Điều này có thể giúp mã của bạn dễ đọc và dễ bảo trì hơn.

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('Mức lương của tôi: $' || my_salary);

-- Đây sẽ gây ra lỗi:
-- my_salary := -1000;
END;

Trong ví dụ này, chúng ta đã tạo một subtype positive_number đảm bảo rằng giá trị luôn dương.

Giá trị NULL trong PL/SQL

Cuối cùng, hãy nói về các giá trị NULL. Trong PL/SQL, NULL đại diện cho một giá trị không rõ hoặc không có. Nó không giống như số không hoặc một chuỗi trống.

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

IF var2 IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('var2 không phải NULL, nó là một chuỗi trống');
END IF;
END;

Đoạn mã này minh họa sự khác biệt giữa NULL và một chuỗi trống.

Và thế là xong! Chúng ta đã bao gồm các loại dữ liệu chính trong PL/SQL. Nhớ rằng việc hiểu các loại dữ liệu là rất quan trọng để viết mã hiệu quả và không có lỗi. Hãy tiếp tục thực hành, và sớm bạn sẽ trở thành một chuyên gia PL/SQL!

Credits: Image by storyset