Oracle PL/SQL Kiểu Dữ Liệu

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:

  1. Kiểu dữ liệu ký tự Character trong PL/SQL.
  2. Kiểu dữ liệu số Numeric trong PL/SQL.
  3. Kiểu dữ liệu thời gian Date/Time Datatypes trong PL/SQL.
  4. Kiểu dữ liệu đối tượng Large Object (LOB) Datatypes trong PL/SQL.
  5. Kiểu dữ liệu tập hợp Collection (%type, %Rowtype, Record, Cursor, Table, Array).

 

1.Kiểu dữ liệu ký tự Character trong PL/SQL Oracle.

Kiểu dữ liệu ký tự Character bao gồm các kiểu sau:

Kiểu dữ liệuMô 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
longDữ 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.

Ví dụ 

-- Cú pháp :
Ten_Bien  Kieu_Du_Lieu(Size);

--Ví dụ
v_Nhanvien_Name VARCHAR2(255);

 

2.Kiểu dữ liệu số Number trong PL/SQL Oracle.

Kiểu dữ liệu số bao gồm các kiểu sau:

Kiểu dữ liệuMô 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_floatKiểu số dấu phẩy động 32 bit.4 bytes
binary_doubleKiể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.

Ví dụ

-- Cú pháp :
Ten_Bien  Kieu_Du_Lieu(Size);

--Ví dụ
v_Nhanvien_Age NUMBER;
v_Nhanvien_Salary NUMBER(10,2);

 

3.Kiểu dữ liệu thời gian Date/Time trong PL/SQL Oracle.

Kiểu dữ liệu thời gian bao gồm các kiểu sau:

Kiểu dữ liệuMô 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).
Kích thước cố định là 7 bytes.

7 bytes
interval day to secondKiể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 monthKiể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
timestampKiể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 zoneBao 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.

Ví dụ

-- Cú pháp :
Ten_Bien  Kieu_Du_Lieu(Size);

--Ví dụ
v_Nhanvien_Birthday  Date;

 

4.Kiểu dữ liệu Large Object LOB trong PL/SQL Oracle.

Kiểu dữ liệu đối tượng bao gồm các kiểu sau:

Kiểu dữ liệuMô tảSize
CLOBKiểu dữ liệu ký tự (character data)4 GB
NCLOBKiểu dữ liệu ký tự, văn bản (character text data)4 GB
BLOBKiể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 RAWDữ 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.

Ví dụ

-- Cú pháp :
Ten_Bien  Kieu_Du_Lieu(Size);

--Ví dụ
v_Nhanvien_Content  CLOB;

v_Nhanvien_Photo BLOB;

 

5.Kiểu dữ liệu hỗn hợp Collection trong PL/SQL Oracle.

Kiểu dữ liệu hỗn hợp Collection bao gồm các kiểu sau:

Kiểu dữ liệuMô tảSize
%typeKiểu dữ liệu một cột 
%RawtypeKiểu dữ liệu một dòng 
RecordKiể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.
Chỉ số của kiểu TABLE không nhất thiết liên tục. 

 
ArrayKiểu dữ liệu mảng 
CursorCursor 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

-- 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.

Ví dụ

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

-- 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.

Ví dụ

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;