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:
Nội dung chính ShowShow
13.6.6 CursorsNội dung chính Show
2- Hàm (Function) 3- Thủ tục (Procedure) 4- Các lệnh cơ bảnKhai báo và sử dụng Cursor4.1- Câu Lệnh rẽ nhánh If-elsif-else 4.2- Câu lệnh rẽ nhánh CASE 4.3- Vòng lặp không định trước (LOOP) 4.4- Vòng lặp REPEAT .. UNTIL khai báo con trỏ, trỏ đến một tập dữ liệu (kết quả của Open cursorProduct6) bằng lệnh Open cursorProduct7 4.5- Vòng lặp WHILE .. DO SELECT id,name FROM Product 5- Điều khiển ngoại lệ 5.1- Ví dụ bắt đầu với ngoại lệ5.2- Định nghĩa điều khiển ngoại lệ 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 MySQL supports cursors inside stored programs. The syntax is as in embedded SQL. Cursors have these properties: 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 Open cursorProduct9 Asensitive: The server may or may not make a copy of its result table Đọc dữ liệu sử dụng lệnh như sau: FETCH NEXT FROM cursorProduct INTO @id, @title Read only: Not updatable Nonscrollable: Can be traversed only in one direction and cannot skip rows Cursor declarations must appear before handler declarations and after variable and condition declarations. WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'ID:' + CAST(@id as nvarchar) PRINT 'TITLE:' @title FETCH NEXT FROM cursorProduct INTO @it, @title END Example: 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ệnh1- Bắt đầu với MySQL Workbench --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ên2- Hàm (Function) 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. 3- Thủ tục (Procedure) 4- Các lệnh cơ bản 4.1- Câu Lệnh rẽ nhánh If-elsif-else 1- Bắt đầu với MySQL Workbench2- Hàm (Function) 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. 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. 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. 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. 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. 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ó. Hàm cũng có thể được lưu giữ ngay trên database dưới dạng Store procedure. 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ụ: 0Hủy Function (Drop function): 1Gọi hàm. 2Ví 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:
3Nhấ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. SELECT. 4Kế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 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à Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, 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. 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: 5Ví dụ: 6Hủ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: Tạo một hàm (Function) Get_Employee_Infos 8Biên dịch hàm này Chạy hàm Nếu bạn mới bắt đầu với hàm và thủ tục MySQL bạn hãy xem chi tiết mục này, nó sẽ giúp bạn dễ dàng hiểu các vấn đề tiếp theo được đề cập trong tài liệu. 9Nhấn biểu tượng để biên dịch hàm. @variable_name để lưu trữ các tham số đầu ra. 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: 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. 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 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à Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, 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. SELECT id,name FROM Product0 Ví dụ: SELECT id,name FROM Product1 Else_If_Example SELECT id,name FROM Product2 Hủy Function (Drop function): Gọi hàm.Ví dụ tạo một hàm. SELECT id,name FROM Product3 Case_When_Example1 SELECT id,name FROM Product4 Case_When_Example2 SELECT id,name FROM Product5 Đây là một ví dụ tạo một hàm đầu tiên của bạn với MySQL: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à Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, 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. SELECT id,name FROM Product6 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.
Hủy thủ tục: SELECT id,name FROM Product7 Loop_Example2 SELECT id,name FROM Product8 CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DECLARE b, c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur1; OPEN cur2; read_loop: LOOP FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF done THEN LEAVE read_loop; END IF; IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END LOOP; CLOSE cur1; CLOSE cur2; END;7Các bước thực hiện một thủ tục: 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# 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à Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, 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. SELECT id,name FROM Product9 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. 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 DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product0 Cú pháp tạo một thủ tục: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à Store procedure. Với các Store procedure, ngay khi lưu giữ Store procedure, 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. 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: While_Do_Example DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product2 Hủy thủ tục: 7 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.Các bước thực hiện một thủ tục: 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ó. 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. Handling_Exception_Example1 DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product3 Nhấn vào biểu tượng để biên dịch thủ tục.
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) DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product4 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. DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product5 Ví dụ 2: Handling_Exception_Example2 DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product6 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: MySQL. Và giờ bạn có thể xem quy tắc tổng quát: Cú pháp: DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product7 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). Có thể nhận hai giá trị CONTINUE hoặc EXIT. CONTINUE hoặc EXIT.
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). Có thể nhận hai giá trị CONTINUE hoặc EXIT.
Chú ý: Nếu một điều kiện phát sinh, mà bạn không khai báo một bộ điều khiển (handler) nào, chương trình sẽ sử lý theo mặc định, tùy thuộc vào lớp điều kiện:
SQLWARNING là viết tắt cho lớp các SQLSTATE có giá trị bắt đầu bởi '01'.
Với các điều kiện SQLEXCEPTION, chương trình thủ tục sẽ bị ngừng tại vị trí lệnh phát sinh điều kiện (ngoại lệ). DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product8 Đối với các điều kiện SQLWARNING hoặc NOT FOUND, chương trình vẫn tiếp tục thực thi, giống như có bộ điều khiển CONTINUE (CONTINUE handler).SQLException: DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product9 Bạn có thể tra cứu mã lỗi và các thông điệp lỗi tại:Ví dụ với mã lỗi:
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...TODO 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 Open cursorProduct0 |