Hướng dẫn cursor trong mysql
Show
13.6.6 CursorsMySQL supports cursors inside stored programs. The syntax is as in embedded SQL. Cursors have these properties:
Cursor declarations must appear before handler declarations and after variable and condition declarations. Example:
Khai báo và sử dụng CursorTrong các truy vấn T-SQL, như tại các Stored Procedure, ta có thể sử dụng các con trỏ Ở một thời điểm, Để sử dụng con trỏ trong các Bước 1: khai báo con trỏ, trỏ đến một tập dữ liệu (kết quả của Ví dụ có một tập dữ liệu từ câu lệnh Select như sau: SELECT id,name FROM Product Ta khai báo một con trỏ đặt tên là DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product Bước 2: Khi bắt đầu quá trình đọc các dòng dữ liệu từ Cursor trên, thì phải mở con trỏ, thực hiện như sau: Open cursorProduct Khi Cursor được mở, con trỏ sẽ trỏ tới dòng đầu tiên
của tập dữ liệu, lúc này có thể đọc nội dung dòng đó bằng lệnh Bước 3: Đọc dữ liệu sử dụng lệnh như sau: FETCH NEXT FROM cursorProduct INTO @id, @title Lệnh trên sẽ đọc nội dung dòng hiện tại, lưu vào biến @id và @title (vì dữ liệu trong Cursor này có 2 cột). Nếu đọc thành công thì dịch chuyển con trỏ tới dòng tiếp theo Để kiệm tra việc Kết hợp những điều trên lại, để đọc từng dòng từ đầu đến cuối sẽ làm như sau: WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'ID:' + CAST(@id as nvarchar) PRINT 'TITLE:' @title FETCH NEXT FROM cursorProduct INTO @it, @title END Bước 4: sau khi không còn dùng đến Cursor, cần đóng lại và giải phóng các tài nguyên nó chiếm giữ CLOSE cursorProduct DEALLOCATE cursorProduct Tóm tắt lại các câu lệnhCác câu lệnh sử dụng Cursor ở trên, tổng hợp lại trong một ví dụ hoàn chỉnh như sau: --Khai báo biến @id, @title để lưu nội dung đọc DECLARE @id int DECLARE @title nvarchar(200) DECLARE cursorProduct CURSOR FOR -- khai báo con trỏ cursorProduct SELECT id, title FROM Product -- dữ liệu trỏ tới OPEN cursorProduct -- Mở con trỏ FETCH NEXT FROM cursorProduct -- Đọc dòng đầu tiên INTO @id, @title WHILE @@FETCH_STATUS = 0 --vòng lặp WHILE khi đọc Cursor thành công BEGIN --In kết quả hoặc thực hiện bất kỳ truy vấn --nào dựa trên kết quả đọc được PRINT 'ID:' + CAST(@id as nvarchar) PRINT 'TITLE:' @title FETCH NEXT FROM cursorProduct -- Đọc dòng tiếp INTO @id, @title END CLOSE cursorProduct -- Đóng Cursor DEALLOCATE cursorProduct -- Giải phóng tài nguyên Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người. Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất. Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi. Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook TÀI LIỆU ĐANG ĐƯỢC CẬP NHẬP 70% 1- Bắt đầu với MySQL WorkbenchTrong tài liệu này tôi sẽ hướng dẫn bạn lập trình MySQL trên công cụ trực quan MySQL Workbench. Nếu bạn sử dụng một công cụ trực quan khác để viết code thì cũng không có nhiều khác biệt gì cả. Đây là hình ảnh MySQL Workbench trong khi bạn mới mở nó. Click vào vùng khoanh đỏ để chọn SCHEMA bạn muốn làm việc. Có một số SCHEMA ví dụ có sẵn khi bạn cài đầy đủ phiên bản MySQL Community. Hoặc bạn có thể tạo SCHEMA learningsql, một SCHEMA ví dụ, được sử dụng trong một vài tài liệu hướng dẫn MySQL trên o7planning.org. Nhấn phải chuột vào một SCHEMA, chọn "Set as Default Schema" để làm việc với schema này. Nhấn vào biểu tượng tạo mới một cửa sổ SQL để viết code (1). Nhấn vào vùng khoanh tròn (2) để ẩn một số cửa sổ không cần thiết. 2- Hàm (Function) Giống như thủ tục, hàm
(function) 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ó. 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. Đây là một ví dụ tạo một hàm đầu tiên của bạn với MySQL:
Nhấn biểu tượng để biên dịch hàm. Các hàm có thể tham gia vào trong câu lệnh SELECT.
Kết quả chạy câu lệnh SQL trên: 3- Thủ tục (Procedure) 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 không trả về giá trị trực tiếp như hàm. Nhưng nó có thể có không hoặc nhiều tham số đầu ra. Cú pháp tạo một thủ tục:
Ví dụ:
Hủy thủ tục:
Các bước thực hiện một thủ tục: Ví dụ tạo một thủ tục: Ở đây tôi tạo một thủ tục đơn giản, với tham số truyền vào là p_Emp_ID và có 3 tham số đầu ra, v_First_Name, v_Last_Name, v_Dep_ID. Get_Employee_Infos
Nhấn vào biểu tượng để biên dịch thủ tục. Test thủ tục Trong lập trình việc test một thủ tục và dò tìm lỗi là vấn đề rất quan trọng. Mở một cửa sổ mới và thực thi đoạn lệnh gọi thủ tục:
Sử dụng @variable_name để lưu trữ các tham số đầu ra. 4- Các lệnh cơ bả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. 4.1- Câu Lệnh rẽ nhánh If-elsif-elseCú pháp:
Ví dụ:
Else_If_Example
Kết quả test thủ tục: 4.2- Câu lệnh rẽ nhánh CASECú Pháp:
Case_When_Example1
Case_When_Example2
4.3- Vòng lặp không định trước (LOOP)Cú pháp:
Trong vòng lặp LOOP bạn có thể sử dụng LEAVE để thoát ra khỏi vòng lặp, RETURN cũng có thể được sử dụng, nhưng nó là lệnh thoát ra khỏi thủ tục.
Loop_Example1
Loop_Example2
4.4- Vòng lặp REPEAT .. UNTILVòng lặp REPEAT .. UNTIL có nghĩa là lặp .. cho tới khi điều kiện không còn đúng nữa. Nó giống với vòng lặp do .. while trong ngôn ngữ Java, C/C++, C# Cú pháp:
Trong vòng lặp REPEAT.. UNTIL bạn cũng có thể sử dụng lệnh LEAVE, và ITERATE và ý nghĩa không có gì thay đổi (Xem thêm trong LOOP). Repeat_Until_Example
4.5- Vòng lặp WHILE .. DOCú pháp:
Trong vòng lặp WHILE .. DO bạn cũng có thể sử dụng lệnh LEAVE, và ITERATE và ý nghĩa không có gì thay đổi (Xem thêm trong LOOP). While_Do_Example
5- Điều khiển ngoại lệTrong khi lập trình MySQL có thể một lỗi có thể phát sinh, chẳng hạn trèn vào một bản ghi trùng lặp khóa chính, MySQL sẽ ném ra một ngoại lệ có mã số tương ứng với nguyên nhân gây lỗi. Trong MySQL để sử lý tình huống ngoại lệ bạn định nghĩa ra một biến, và bảo với MySQL sẽ gán một giá trị nào đó vào biến này khi có ngoại lệ phát sinh. Bạn có thể kiểm tra giá trị của biến để biết được lỗi vừa xẩy ra và sử lý nó. 5.1- Ví dụ bắt đầu với ngoại lệHãy xem một thủ tục trèn dữ liệu vào bảng Department: Handling_Exception_Example1
Khi bạn thực thi thủ tục trên:
Chúng ta sửa lại code của thủ tục trên, thêm vào các đoạn code sử lý ngoại lệ. Handling_Exception_Example1 (2)
Hãy xem hình minh họa khi bạn gọi thủ tục ở trên: Bạn đã khai báo bộ điều khiển lỗi 1062, là loại CONTINUE nghĩa là sau bắt gặp lỗi 1062 chương trình vẫn tiếp tục chạy các dòng code phía dưới. Khi bạn gọi thủ tục:
Trong trường hợp bạn muốn chương trình thoát ra khỏi khối lệnh khi gặp lỗi, bạn có thể khai báo bộ điều khiển lỗi là kiểu EXIT.
Ví dụ 2: Handling_Exception_Example2
5.2- Định nghĩa điều khiển ngoại lệCác ví dụ trên đã minh họa cách thức điều khiển ngoại lệ trong MySQL. Và giờ bạn có thể xem quy tắc tổng quát: Cú pháp:
Có thể nhận hai giá trị CONTINUE hoặc EXIT.
Mô tả các đặc điểm của lỗi mà khi lỗi phát sinh, bộ điều khiển này sẽ được hoạt động. Nó có thể là:
Cụ thể:
Nếu một điều kiện phát sinh, mà không có một bộ điều khiển nào khai báo, thì hành động sử lý tùy thuộc vào lớp điều kiện:
Ví dụ với mã lỗi:
Ví dụ với SQLException:
5.3- Chuẩn đoán lỗi (Get DIAGNOSTICS)Một khi ngoại lệ xẩy ra, bạn muốn lấy các thông tin về lỗi, chẳng hạn mã lỗi, SQLSTATE, và thông điệp lỗi, các thông tin khác...
6- Con trỏ (Cursor)6.1- Con trỏ là gì?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. 6.2- Ví dụ với Con trỏCursor_Example |