- Giới thiệu
- Bắt đầu với PL/SQL cần những gì?
- Tổng quan về PL/SQL
- Các lệnh PL/SQL cơ bản
- Lệnh If-elsif-else
- Vòng lặp không định trước (LOOP)
- Vòng lặp có định trước (FOR LOOP)
- Vòng lặp while (WHILE)
- Bắt đầu với PL/SQL sử dụng PL/SQL Developer
- Các kiểu dữ liệu thông dụng và khai báo
- Kiểu dữ liệu số
- Kiểu text
- Kiểu Date/time
- 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ữ liệu mảng (Array)
- Con trỏ (Cursor)
- Con trỏ là gì?
- Con trỏ tường minh (Explicit Cursor)
- Con trỏ không tường minh (Implicit Cursor)
- Thủ tục (Procedure)
- Test thủ tục trên PL/SQL Developer
- Debug thủ tục trên PL/SQL Developer
- Hàm (Function)
- Package
- Tạo package trên PL/SQL Developer
- Test Package
- Oracle Application Express là gì?
1- Giới thiệu
PL/SQL (Procedural Language/Structured Query Language) là một ngôn ngữ lập trình lập trình hướng thủ tục sử dụng cho Oracle SQL. Nó là một mở rộng của Oracle SQL.
PL/SQL bao gồm các thành phần ngôn ngữ hướng thủ tục bao gồm điều kiện và vòng lặp. Nó cho phép khai báo hằng số và biến, thủ tục và các hàm, kiểu dữ liệu và biến của các kiểu dữ liệu, và các trigger. Nó có thể sử lý các ngoại lệ (lỗi tại thời gian chạy). Mảng cũng được hỗ trợ nâng cấp để sử dụng cho các tập hợp trong PL/SQL. Từ phiên bản 8 trở đi nó bao gồm thêm các tính năng hướng đối tượng. Nó có thể tạo một đơn vị PL/SQL như thủ tục, hàm, package, kiểu dữ liệu, triggers, những thứ được lưu trữ trong database được tái sử dụng bởi các ứng dụng bất kỳ giao tiếp với ứng dụng Oracle.
Chú ý: Các hình minh họa dưới đây tôi sử dụng công cụ PL/SQL Developer phiên bản 8.x, tuy nhiên cũng không có khác biệt nếu bạn sử dụng PL/SQL Developer phiên bản 10.x hoặc một phiên bản khác.
Để có thể tiếp cận nhanh với PL/SQL bạn cần có một công cụ lập trình. Theo kinh nghiệm làm việc của tôi bạn có thể sử dụng PL/SQL Developer, đây là một công cụ trực quan làm việc với Oracle và để lập trình PL/SQL.
Bạn có thể xem hướng dẫn cài đặt và cấu hình PL/SQL tại:
- Cài đặt PL/SQL Developer trên Windows
Trong tài liệu này tôi sử dụng LearningSQL (Một database nhỏ dùng để hướng dẫn học SQL trong website o7planning.org). Bạn có thể tạo database này theo hướng dẫn dưới đây:
- Cơ sở dữ liệu Oracle mẫu để học SQL
Có một số khái niệm cần phải nắm vững khi lập trình với PL/SQL:
- Mỗi lệnh SQL kềt thúc bằng dấu chấm phẩy (;)
- Các lệnh thuộc "ngôn ngữ định nghĩa dữ liệu" (Data Definition Language - DDL) không được sử dụng trong PL/SQL
- Lệnh SELECT.. INTO trả về nhiều dòng có thể gây ra exception ( > 1 dòng).
- Lệnh SELECT .. INTO không trả về dòng nào có thể gây ra exception
- Các lệnh thuộc "ngôn ngữ thao tác trên dữ liệu" (Data Manipulation Language - DML) có thể tác động trên nhiều dòng dữ liệu.
- Sử dụng toán tử := để giá giá trị cho một biến.
PL/SQL được tổ chức theo từng khối lệnh, Một khối lệnh có thể có các khối lệnh con bên trong nó.
Ở đây tôi giới thiệu tổng quan về các lệnh cơ bản của PL/SQL. Bạn sẽ hiểu hơn về nó thông qua các ví dụ ở các phần tiếp theo.
Cú pháp:
Ví dụ:
Cú pháp:
Ví dụ:
Cú pháp:
Ví dụ:
Cú pháp:
Ví dụ:
Trước hết bạn cần mở PL/SQL Developer, và đăng nhập vào user learningsql:
Trên PL/SQL Developer tạo mới một cửa sổ SQL:
Viết một đoạn code đơn giản tính tổng 2 số.
Nhấn biểu tượng hoặc nhấn F8 để thực thi đoạn code.
Kết quả chạy ví dụ:
Các kiểu dữ liệu số trong PL/SQL
Data Type | Description |
---|---|
PLS_INTEGER | Số tự nhiên có dấu 32 bit nằm trong khoảng -2,147,483,648 tới 2,147,483,647. |
BINARY_INTEGER | Số tự nhiên có dấu 32 bit nằm trong khoảng -2,147,483,648 tới 2,147,483,647. |
BINARY_FLOAT | Kiểu dấu chấm động số thực với độ chính xác đơn (Single-precision) |
BINARY_DOUBLE | Kiểu dấu chấm động số thực với độ chính xác gấp đôi (Double-precision) |
NUMBER(prec, scale) | Kiểu dấu chấm cố định (Fixed-point) với giá trị tuyệt đối từ 1E-130 tới (không bao gồm) 1.0E126. Một biến NUMBER cũng có thể mô tả 0. |
DEC(prec, scale) | Kiểu dấu chấm cố định, tiêu chuẩn ANSI với độ chính xác tối đa 38 số thâp phân. |
DECIMAL(prec, scale) | Kiểu dấu chấm cố định, tiêu chuẩn IBM với độ chính xác tối đa 38 số thập phân. |
NUMERIC(pre, secale) | Loại số thực (Floating type) với độ chính xác tối đa 38 số thập phân. |
DOUBLE PRECISION | Loại số chấm động, số thực, tiêu chuẩn ANSI với độ chính xác 126 số nhị phân (khoảng 38 số thập phân). |
FLOAT | Loại số chấm động, số thực tiêu chuẩn ANSI và IBM với độ chính xác tối đa 126 số nhị phân (khoảng 38 số thập phân). |
INT | Kiểu số nguyên, tiêu chuẩn ANSI với độ chính xác tối đa 38 chữ số thập phân |
INTEGER | Kiểu số nguyên, tiêu chuẩn ANSI và IBM với độ chính xác 38 chữ số thập phân |
SMALLINT | Số nguyên từ -32768 --> 32767 |
REAL | Kiểu số chấm động, số thực, với độ chính xác tối đa 63 số nhị phân (Khoảng 18 số thập phân). |
Các kiểu số thông dụng nhất:
Kiểu số | Khai báo sử dụng |
Number | v_Amount Number(15,2) v_Salary Number; |
Integer | v_Age Integer; |
Float | v_Amount Float; |
Double | |
Real |
Thông dụng nhất:
Kiểu text | Khai báo sử dụng |
Varchar2 | v_First_Name Varchar2(32); |
Kiểu dữ liệu | Khai báo sử dụng |
Date | v_Birthday Date; |
Đây là cấu trúc bảng EMPLOYEE:
Cột First_Name trong bảng Employee có kiểu dữ liệu Varchar2 và có độ dài 20 ký tự. Để khai báo một biến có thể chứa giá trị của cột này bạn có thể khai báo theo cách dưới đây:
Ví dụ:
Cú pháp:
Ví dụ:
Kết quả chạy ví dụ:
Bạn có thể định nghĩa ra kiểu dữ liệu Record, kiểu dữ liệu này chứa một vài cột. Cú pháp:
Ví dụ:
Kết quả chạy ví dụ:
Bạn có thể định nghĩa một kiểu dữ liệu mới, nó có thể lưu trữ nhiều phần tử, đó là kiểu TABLE.
Các đặc điểm của kiểu TABLE:
- Kiểu dữ liệu TABLE giống như một mảng, 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. Ví dụ TABLE có 3 phần tử tại chỉ số 1, 3, 5.
Cú pháp:
Ví dụ:
Kết quả chạy ví dụ:
Các hàm của kiểu TABLE:
Tên hàm/Thuộc tính | Ý nghĩa | Ví dụ sử dụng |
• DELETE | Xóa các dòng trong bảng | v_tbl.delete(3); |
• EXISTS | Trả về TRUE nếu tồn tại phần tử chỉ định trong Table. | v_e:= v_tbl.exists(3); |
• COUNT | Trả về số lượng phần tử trong table. | v_count:=v_tbl.count; |
• FIRST | Trả về chỉ số của phần tử đầu tiên trong table. | v_first_idx:=v_tbl.first; |
• LAST | Trả về chỉ số phần tử cuối cùng trong table. | v_last_idx:=v_tbl.last; |
• NEXT | Trả về chỉ số của phần tử tiếp theo trong bảng so với chỉ số được chỉ định. | v_idx:= v_tbl.next(2); |
• PRIOR | Trả về chỉ số phần tử đứng trước so với phần tử được chỉ định. | v_idx:=v_tbl.prior(2); |
Ví dụ:
Kết quả chạy ví dụ:
Cú pháp:
Một mảng có N phần tử. Các phần tử của mảng được đánh chỉ số liên tục bắt đầu từ 1 đến N.
Ví dụ:
Kết quả chạy ví dụ:
Cursor là kiểu biến 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 khai báo con trỏ:
Ví dụ:
Có hai loại con trỏ (Cursor):
- Con trỏ tường minh
- Con trỏ không tường minh.
Các thuộc tính của Con trỏ:
Thuộc tính | Ý nghĩa |
%isopen | trả lại giá trị True nếu cursor đang mở |
%notfound | trả lại giá trị true nếu không còn dòng tiếp theo |
%found | trả lại giá tri true nếu vẫn còn dòng tiếp theo. |
%rowcount | trả lại số row đã duyệt qua. |
Các bước khai báo và sử dụng con trỏ tường minh:
Ví dụ:
Kết quả chạy ví dụ:
Con trỏ không tường minh bạn có thể không cần viết lệnh mở/đóng nó một cách rõ ràng.
Sử dụng lệnh For để duyệt trên con trỏ theo cú pháp:
Ví dụ:
Một nhóm các lệnh thực hiện chức năng nào đó có thể được gom lại trong một thủ tục (procedure) nhằm làm tăng khả năng xử lý,khả năng sử dụng chung, tăng tính bảo mật và an toàn dữ liệu,tiện ích trong phát triển.
Thủ tục có thể được lưu giữ ngay trong database như một đối tượng của database, sẵn sàng cho việc tái sử dụng. Thủ tục lúc này được gọi là Stored procedure. Với các thủ tục, ngay khi lưu giữ (save), chúng đã được biên dịch thành dạng p-code vì thế có thể nâng cao khả năng thực hiện.
Thủ tục có thể được lưu giữ ngay trong database như một đối tượng của database, sẵn sàng cho việc tái sử dụng. Thủ tục lúc này được gọi là Stored procedure. Với các thủ tục, ngay khi lưu giữ (save), chúng đã được biên dịch thành dạng p-code vì thế có thể nâng cao khả năng thực hiện.
Thủ tục không trả về giá trị trực tiếp như hàm.
Cú pháp tạo một thủ tục:
Ví dụ:
Hủy thủ tục (drop procedure):
Các bước thực hiện một thủ tục:
Ví dụ tạo một thủ tục:
Đây là một ví dụ tạo một thủ tục đầu tiên trên PL/SQL Developer. ví dụ này sẽ là khuôn mẫu giúp bạn vừa lập trình vừa kiểm tra lỗi nếu có vấn đề xẩy ra.
- Tạo một thủ tục (Procedure)
- Biên dịch thủ tục này
- Chạy thủ tục
- Debug thủ tục bằng PL/SQL Developer để xem chương trình chạy thế nào.
Tạo mới một thủ tục (Procedure):
Nhập vào tên của thủ tục, các tham số sẽ được viết sau:
- Get_Employee_Infos
Thủ tục đã được PL/SQL Developer tạo ra. Tuy nhiên bạn cần sửa lại danh sách tham số, và viết code cho thủ tục này.
Sửa thủ tục của bạn như sau:
Nhấn vào biểu tượng Execute hoặc F8 để biên dịch thủ tục. Trong trường hợp có lỗi code, PL/SQL Developer sẽ thông báo cho bạn.
Nhấn phải chuột vào thủ tục Get_Employee_Infos chọn Test:
Nhập tham số đầu vào, ví dụ:
- p_Emp_Id = 1
Kết quả thực thi thủ tục:
Xem trên màn hình Console:
Test trường hợp khác với các giá trị:
- p_Emp_Id = 9999
Xem trên Console:
Debug trên PL/SQL Developer cho phép bạn xem một thủ tục, hàm đã được chạy thế nào, theo từng lệnh. Giúp bạn dễ dàng tìm ra các vị trí phát sinh lỗi. Bạn có thể xem hướng dẫn tại:
- TODO
Tương tự như thủ tục, hàm (function) cũng là nhóm các lệnh PL/SQL thực hiện chức năng nào đó. Khác với thủ tục, các hàm sẽ trả về một giá trị ngay tại lời gọi của nó.
Hàm cũng có thể được lưu giữ ngay trên database dưới dạng Stored procedure.
Hàm cũng có thể được lưu giữ ngay trên database dưới dạng Stored procedure.
Với việc sử dụng hàm, trong một số trường hợp bạn có thể thấy được các lợi điểm như sau:
- Cho phép thực hiện các thao tác phức tạp(các phép tìm kiếm, so sánh phứctạp) ngay trong mệnh đề của câu lệnh SQL mà nếu không sử dụng hàm bạn sẽ không thể nào thực hiện được
- Tăng tính độc lập của dữ liệu do việc phân tích và xử lý dữ liệu được thực hiện ngay trên Server thay vì trả về dữ liệu trực tiếp cho ứng dụng dưới Client để chúng tiếp tục xử lý.
- Tăng tính hiệu quả của câu lệnh truy vấn bằng việc gọi các hàm ngay trong câu lệnh SQL
- Bạn có thể sử dụng hàm để thao tác trên các kiểu dữ liệu tự tạo. Cho phép thực hiện đồng thời các câu lệnh truy vấn
- Chỉ các hàm do người dùng định nghĩa được lưu trên database mới có thể sử dụng được cho câu lệnh SQL.
- Các hàm do người dùng định nghĩa chỉ được áp dụng cho điều kiện thực hiện trên các dòng dữ liệu (mệnh đề WHERE), không thể áp dụng cho các điều kiện thực hiện trên nhóm (mệnh đề GROUP).
- Tham số sử dụng trong hàm chỉ có thể là loại IN, không chấp nhận giá trị OUT hay giá trị IN OUT.
- Kiểu dữ liệu trả về của các hàm phải là kiểu dữ liệu DATE, NUMBER, NUMBER. Không cho phép hàm trả về kiểu dữ liệu như BOOLEAN, RECORD, TABLE. Kiểu dữ liệu trả về này phải tương thích với các kiểu dữ liệu bên trong Oracle Server .
Cú pháp tạo Hàm.
Ví dụ:
Hủy Function (Drop function):
Gọi hàm.
Ví dụ tạo một hàm.
Các hàm không có tham số OUT, có thể tham gia vào câu lệnh SQL, ví dụ:
Kết quả chạy câu lệnh SQL trên:
Package là một tập hợp các kiểu dữ liệu, biến lưu giữ giá trị và các thủ tục,hàm có cùng một mối liên hệ với nhau, được gộp chung lại. Đặc điểm nổi bật nhất của package là khi một phần tử trong package được gọi tới thì toàn bộ nội dung của package sẽ được nạp vào trong hệ thống. Do đó, việc gọi tới các phần tử khác trong package sau này sẽ không phải mất thời gian nạp vào hệ thống nữa. Từ đó, nâng cao tốc độ thực hiện lệnh của toàn bộ hàm, thủ tục có trong package.
Cấu trúc của Package:
Một package được cấu trúc làm hai phần. Phần mô tả (specification) định nghĩa các giao tiếp có thể có của package với bên ngoài. Phần thân (body) là các cài đặt cho các giao tiếp có trong phần mô tả ở trên.
Trong cấu trúc của package bao gồm 5 thành phần:
- Public variable (biến công cộng): là biến mà các ứng dụng bên ngoài có thể tham chiếu tới được (sử dụng được).
- Public procedure (thủ tục công cộng): bao gồm các hàm, thủ tục của package có thể gọi từ các ứng dụng bên ngoài.
- Private procedure (thủ tục riêng tư): là các hàm, thủ tục có trong package và chỉ có thể được gọi bởi các hàm hay thủ tục khác trong package đó mà thôi.
- Global variable (biến tổng thể): là biến được khai báo dùng trong toàn bộ package, ứng dụng bên ngoài tham chiếu được tới biến này .
- Private variable (biến riêng tư): là biến được khai báo trong một hàm, thủ tục thuộc package.Nó chỉ có thể được sử dụng trong nội bộ hàm hay thủ tục đó.
Khai báo Package:
PL/SQL Developer giúp bạn tạo nhanh package spec & package body.
Package đã được PL/SQL Developer tạo ra, với các gợi ý để viết package được tự động sinh ra. Bạn có thể xóa hết chúng đi.
Bạn có thể xóa hết các code tự tạo ra tự động bởi PL/SQL Developer để có một package rỗng:
- PKG_EMP (Package Spec)
- PKG_EMP (Package Body)
Cũng giống như thủ tục và hàm, bạn cũng có thể test các thủ tục/hàm trên Package, điều này giúp bạn phát hiện ra các lỗi trong quá trình lập trình.
Kết quả test:
Oracle Application Express (Oracle APEX), trước đây gọi là HTML DB, là một công cụ phát triển ứng dụng web nhanh chóng cho các cơ sở dữ liệu Oracle. Chỉ sử dụng một trình duyệt web và kinh nghiệm lập trình không cần nhiều, bạn có thể phát triển và triển khai các ứng dụng chuyên nghiệp mà cả hai nhanh chóng và bảo mật. Oracle Application Express kết hợp những phẩm chất của một cơ sở dữ liệu cá nhân, năng suất, dễ sử dụng, và tính linh hoạt với những phẩm chất của một cơ sở dữ liệu doanh nghiệp, bảo mật, toàn vẹn, khả năng mở rộng, tính sẵn có và xây dựng cho web. Application Express là một công cụ để xây dựng các ứng dụng dựa trên web và các môi trường phát triển ứng dụng cũng thuận tiện dựa trên web.
Oracle APEX chỉ đòi hỏi bạn có một kỹ năng về Oracle PL/SQL. Bạn có thể xem thêm Oracle Application Express là gì tại:
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
Hướng dẫn lập trình Oracle PL/SQL từ A-Z, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty