Khi lập trình các chương trình phần mềm bạn thường xuyên phải khai báo biến và kiểu dữ liệu.Vậy kiểu dữ liệu là gì và được sử dụng như thế nào trong các chương trình phần mềm? Trong hướng dẫn này chúng tôi sẽ giúp bạn hiểu về các kiểu dữ liệu trong Oracle PL/SQL.
Trong PL/SQL có 2 loại kiểu dữ liệu đó là: Scalar (vô hướng) và Composite (hỗn hợp)
Kiểu dữ liệu vô hướng (Scalar): Bao gồm các kiểu dữ liệu chuỗi ký tự (Character Datatypes), kiểu dữ liệu số (Numeric Datatypes), kiểu dữ liệu Boolean, kiểu dữ liệu thời gian (Date/Time Datatypes), kiểu dữ liệu đối tượng (Large Object (LOB) Datatypes)
Kiểu dữ liệu Hỗn hợp (Composite): Bao gồm các kiểu dữ liệu như kiểu dữ liệu một cột (%type), Kiểu dữ liệu một dòng (%Rowtype), kiểu dữ liệu Record, kiểu dữ liệu Table, kiểu dữ lieu mảng (Array) và kiểu dữ liệu con trỏ (Cursor).
Bài này chúng ta sẽ đi tìm hiểu các kiểu dữ liệu thường dùng trong lập trình PL/SQL dưới đây:
Kiểu dữ liệu ký tự Character bao gồm các kiểu sau:
Kiểu dữ liệu | Mô tả | Size |
---|---|---|
char(size) | Dữ liệu ký tự có độ dài cố định, có kích thước byte hoặc ký tự. Kích thước nhỏ nhất và tối thiểu là 1 byte.Kích thước tối đa là 2000 byte hoặc ký tự. | 2000 bytes |
nchar(size) | Dữ liệu ký tự có độ dài cố định của các ký tự có kích thước độ dài. Số lượng byte có thể gấp hai lần kích thước đối với mã hóa AL16UTF16 và gấp ba lần đối với mã hóa UTF8.. Kích thước mặc định và tối thiểu là 1 ký tự. Kích thước tối đa được xác định theo định nghĩa bộ ký tự quốc gia, với giới hạn trên là 2000 byte. | 2000 bytes |
varchar2(size) | Chuỗi ký tự có độ dài thay đổi của byte hoặc ký tự.Bạn phải chỉ định kích thước cho VARCHAR2. Kích thước tối thiểu là 1 byte hoặc 1 ký tự. Kích thước tối đa là: • 32767 byte hoặc ký tự nếu MAX_STRING_SIZE = EXTENDED • 4000 byte hoặc ký tự nếu MAX_STRING_SIZE = STANDARD | 4000 bytes |
nvarchar2(size) | Chuỗi ký tự có độ dài thay đổi của byte hoặc ký tự.Bạn phải chỉ định kích thước cho VARCHAR2. Kích thước tối thiểu là 1 byte hoặc 1 ký tự. Kích thước tối đa là: • 32767 byte hoặc ký tự nếu MAX_STRING_SIZE = EXTENDED • 4000 byte hoặc ký tự nếu MAX_STRING_SIZE = STANDARD | 4000 bytes |
long | Dữ liệu ký tự có độ dài thay đổi lên tới 2 gigabyte. | 2 GB |
- Ví dụ khai báo và sử dụng kiểu dữ liệu Character trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Kieu_Du_Lieu(Size);
--Ví dụ
v_Nhanvien_Name VARCHAR2(255);
Kiểu dữ liệu số bao gồm các kiểu sau:
Kiểu dữ liệu | Mô tả | Size |
---|---|---|
number(p,s) | Kiểu dữ liệu số bao gồm phần chính xác p và phần thập phần s. p trong dải từ 1 đến 38, s trong dải từ -84 đến 127. | 22 bytes |
binary_float | Kiểu số dấu phẩy động 32 bit. | 4 bytes |
binary_double | Kiểu số dấu phẩy động 64 bit. | 8 bytes |
- Ví dụ khai báo và sử dụng kiểu dữ liệu số Number trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Kieu_Du_Lieu(Size);
--Ví dụ
v_Nhanvien_Age NUMBER;
v_Nhanvien_Salary NUMBER(10,2);
Kiểu dữ liệu thời gian bao gồm các kiểu sau:
Kiểu dữ liệu | Mô tả | Size |
---|---|---|
Date | Kiểu dữ liệu này bao gồm các trường : YEAR, MONTH, DAY, HOUR, MINUTE, and SECOND.Nó không có phần thập phân của giây SECOND và không có múi giờ (time zone). | 7 bytes |
interval day to second | Kiểu dữ liệu bao gồm ngày, giờ, phút và giây : DAY, HOUR, MINUTE, and SECOND. Kích thước cố định 11 bytes. | 11 bytes |
interval year to month | Kiểu dữ liệu bao gồm năm và tháng: YEAR và MONTH. Kích thước cố định là 5 bytes | 5 bytes |
timestamp | Kiểu dữ liệu này bao gồm các trường : YEAR, MONTH, DAY, HOUR, MINUTE, and SECOND.Trong đó phần giây SECOND có chứa phần số thập phân nhưng nó không chứa múi giờ (time zone) Kích thước là 7 bytes hoặc 11 bytes, tùy thuộc vào độ chính xác. | 11 bytes |
timestamp with time zone | Kiểu dữ liệu này chứa các trường: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, vàTIMEZONE_MINUTE. Phần giây SECOND có chứa phần số thập phân và múi giờ (time zone) rõ ràng .Kích thước được cố định ở 13 byte. | 13 bytes |
timestamp with with local time zone | Bao gồm các giá trị của timestamp with time zone. • Dữ liệu được chuẩn hóa theo múi giờ của cơ sở dữ liệu khi nó được lưu trữ trong cơ sở dữ liệu. • Khi dữ liệu được truy xuất, người dùng sẽ thấy dữ liệu trong múi giờ của phiên. Định dạng mặc định được xác định rõ ràng bởi tham số NLS_TIMESTAMP_FORMAT hoặc ngầm định bởi tham số NLS_TERRITORY. Kích thước là 7 hoặc 11 byte, tùy thuộc vào độ chính xác. | 11 bytes |
- Ví dụ khai báo và sử dụng kiểu dữ liệu Date/Time trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Kieu_Du_Lieu(Size);
--Ví dụ
v_Nhanvien_Birthday Date;
Kiểu dữ liệu đối tượng bao gồm các kiểu sau:
Kiểu dữ liệu | Mô tả | Size |
---|---|---|
CLOB | Kiểu dữ liệu ký tự (character data) | 4 GB |
NCLOB | Kiểu dữ liệu ký tự, văn bản (character text data) | 4 GB |
BLOB | Kiểu dữ liệu nhị phân Binary (binary data) | 4 GB |
RAW | Dữ liệu nhị phân có kích thước độ dài là byte. Bạn phải chỉ định kích thước cho giá trị RAW. Kích thước tối đa là: • 32767 byte nếu MAX_STRING_SIZE = EXTENDED • 2000 byte nếu MAX_STRING_SIZE = STANDARD | 2000 bytes |
LONG RAW | Dữ liệu nhị phân có độ dài thay đổi lên tới 2 gigabyte. | 2 GB |
- Ví dụ khai báo và sử dụng kiểu dữ liệu Large Object LOB trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Kieu_Du_Lieu(Size);
--Ví dụ
v_Nhanvien_Content CLOB;
v_Nhanvien_Photo BLOB;
Kiểu dữ liệu hỗn hợp Collection bao gồm các kiểu sau:
Kiểu dữ liệu | Mô tả | Size |
---|---|---|
%type | Kiểu dữ liệu một cột | |
%Rawtype | Kiểu dữ liệu một dòng | |
Record | Kiểu dữ liệu một hoặc nhiều cột | |
Table | Kiểu dữ liệu TABLE giống như một mảng, nó có thể lưu trữ nhiều phần tử, nhưng có số phần tử không giới hạn. | |
Array | Kiểu dữ liệu mảng | |
Cursor | Cursor là kiểu dữ liệu có cấu trúc, cho phép bạn xử lý dữ liệu gồm nhiều dòng. Số dòng phụ thuộc vào câu lệnh truy vấn dữ liệu sau nó.Trong quá trình xử lý, bạn có thể thao tác với Cursor thông qua từng dòng dữ liệu. Dòng dữ liệu này được định vị bởi một con trỏ. Với việc dịch chuyển con trỏ, bạn có thể lấy được toàn bộ dữ liệu của một dòng hiện tại. |
- Cú pháp kiểu dữ liệu một cột %Type trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Ten_bang_Table.Tencot_Column%Type;
- Ví dụ khai báo và sử dụng kiểu dữ liệu một cột %Type trong Oracle PL/SQL.
DECLARE
--Khai báo kiểu biến và kiểu dữ liệu 1 cột %Type
pv_NhanvienID HR.NHANVIEN.NHANVIEN_ID%Type := 10022;
v_Name HR.NHANVIEN.NHANVIEN_NAME%Type;
BEGIN
SELECT NV.NHANVIEN_NAME INTO v_Name
FROM HR.NHANVIEN NV
WHERE NV.NHANVIEN_ID = pv_NhanvienID;
Dbms_Output.Put_Line('v_First_Name= ' || v_Name);
Exception
When No_Data_Found Then
-- Trường hợp câu lệnh SELECT .. INTO không có bản ghi nào.
Dbms_Output.Put_Line('No data with emp_id= ' || v_Name);
END ;
- Cú pháp kiểu dữ liệu một dòng %RawType trong Oracle PL/SQL.
-- Cú pháp :
Ten_Bien Ten_bang_Table%RawType;
- Ví dụ khai báo và sử dụng kiểu dữ liệu một dòng %RawType trong Oracle PL/SQL.
DECLARE
--Khai báo kiểu biến và kiểu dữ liệu 1 cột %Type
v_NhanvienID HR.NHANVIEN.NHANVIEN_ID%Type := 10022;
-- Khai báo biến có kiểu dữ liệu 1 dòng của bảng Nhanvien.
v_Nhanvien HR.NHANVIEN%Rowtype;
BEGIN
SELECT * INTO v_Nhanvien FROM HR.NHANVIEN NV
WHERE NV.NHANVIEN_ID = v_NhanvienID;
Dbms_Output.Put_Line('NhanvienID= ' || v_Nhanvien.Nhanvien_ID);
Dbms_Output.Put_Line('NhanvienName= ' || v_Nhanvien.Nhanvien_Name);
Dbms_Output.Put_Line('PhoneNumer= ' || v_Nhanvien.Nhanvien_Phone);
Exception
When No_Data_Found Then
-- Trường hợp câu lệnh SELECT .. INTO không có bản ghi nào.
Dbms_Output.Put_Line('No data with emp_id= ' || v_NhanvienID);
END;