Hướng dẫn declare cursor for prepared statement mysql - khai báo con trỏ cho câu lệnh đã chuẩn bị sẵn mysql

Tôi có hai bảng:

people_en: id, name
people_es: id, name

(Xin vui lòng, đừng bận tâm về việc chuẩn hóa. Thiết kế được chuẩn hóa. Các bảng phức tạp hơn nhiều so với điều này nhưng đây chỉ là một cách để đơn giản hóa vấn đề của tôi).

Sau đó tôi có một thủ tục lưu trữ:

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$

Nhiều hay ít, logic trong thủ tục là:

Nếu chọn cho 3 hàng, thì chúng ta phải lặp qua các hàng và làm một cái gì đó với giá trị trong mỗi hàng. Mặt khác, một thứ gì đó khác (không quan trọng những gì, nhưng tôi đặt điều này để làm cho bạn hiểu rằng tôi cần phải có một tuyên bố IF trước khi lặp lại.

Tôi đã thấy và đọc về con trỏ, nhưng không thể tìm thấy nhiều cho các lựa chọn được tạo bởi Concat (có vấn đề gì không?) Và đặc biệt được tạo ra với một tuyên bố đã chuẩn bị. Làm thế nào tôi có thể lặp lại thông qua danh sách kết quả và sử dụng các giá trị từ mỗi hàng? Cảm ơn.


Con trỏ và tuyên bố đã chuẩn bị


Có thể tạo một truy vấn bằng cách sử dụng câu lệnh đã chuẩn bị và sử dụng truy vấn đã chuẩn bị trong con trỏ, nói rằng việc tạo SQL đang lấy tên bảng một cách tự động làm tham số trên quy trình. Làm con trỏ hỗ trợ chuẩn bị tuyên bố. Nếu không thì thay thế là gì.
Do cursor support prepare statements .
If not then what is the alternative .

Mã được đưa ra dưới đây không được biên dịch vì lỗi xuất hiện khi con trỏ được khai báo

Tạo kiểm tra thủ tục (trong TableCame Varchar (255), trong CộtName varchar (20)) bắt đầu set @Query = concat ('select', cộtName, 'từ', tablename); Chuẩn bị STMT từ @Query; Bắt đầu khai báo con trỏ test_cursor cho STMT; CHẤM DỨT; CHẤM DỨT; //
BEGIN
SET @query = CONCAT ('SELECT ',columnname,' FROM ', tablename);
PREPARE stmt from @query;
BEGIN
DECLARE test_cursor CURSOR FOR stmt;
END;
END;
//

Xin đề nghị nếu mã có một giải pháp thay thế.


Môn học

Lượt xem

Được viết bởi

Đăng

Con trỏ và tuyên bố đã chuẩn bị

25123

Ngày 19 tháng 9 năm 2006 02:32 sáng

10325

Ngày 02 tháng 6 năm 2008 03:56 AM

11436

Ngày 21 tháng 7 năm 2008 06:21 PM

23953

Ngày 10 tháng 9 năm 2008 05:27 PM

Xin lỗi, bạn không thể trả lời chủ đề này. Nó đã được đóng cửa.

Nội dung được sao chép trên trang web này là tài sản của chủ sở hữu bản quyền tương ứng. Nó không được xem xét trước bởi Oracle và không nhất thiết phải đại diện cho ý kiến ​​của Oracle hoặc bất kỳ bên nào khác.

13.6.6.2 & NBSP; Tuyên bố khai báo con trỏ

DECLARE cursor_name CURSOR FOR select_statement

Tuyên bố này tuyên bố một con trỏ và liên kết nó với một tuyên bố SELECT lấy lại các hàng để đi qua con trỏ. Để tìm nạp các hàng sau, hãy sử dụng câu lệnh FETCH. Số lượng cột được truy xuất bởi câu lệnh SELECT phải khớp với số lượng biến đầu ra được chỉ định trong câu lệnh FETCH.

Tuyên bố SELECT không thể có mệnh đề

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
2.

Tuyên bố con trỏ phải xuất hiện trước khi khai báo xử lý và sau khi khai báo biến và điều kiện.

Một chương trình được lưu trữ có thể chứa nhiều khai báo con trỏ, nhưng mỗi con trỏ được khai báo trong một khối nhất định phải có một tên duy nhất. Ví dụ, xem phần & nbsp; 13.6.6, con trỏ.

Đối với thông tin có sẵn thông qua các câu lệnh

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
3, trong nhiều trường hợp có thể có được thông tin tương đương bằng cách sử dụng con trỏ với bảng
CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
4.


MySQL 8.0 cung cấp hỗ trợ cho các câu lệnh được chuẩn bị phía máy chủ. Hỗ trợ này tận dụng giao thức nhị phân máy khách/máy chủ hiệu quả. Sử dụng các câu lệnh đã chuẩn bị với các khoản giữ chỗ cho các giá trị tham số có những lợi ích sau:

  • Ít chi phí để phân tích cú pháp câu lệnh mỗi lần nó được thực thi. Thông thường, các ứng dụng cơ sở dữ liệu xử lý khối lượng lớn các câu lệnh gần như giống hệt nhau, chỉ có những thay đổi đối với các giá trị theo nghĩa đen hoặc biến trong các mệnh đề như

    CREATE PROCEDURE myproc(lang char(2))
    BEGIN
        set @select = concat('SELECT * FROM ', lang, ' limit 3');
        PREPARE stm FROM @select;
        EXECUTE stm;
        DEALLOCATE PREPARE stm;
        SET @cnt = FOUND_ROWS(); 
        SELECT @cnt;
        IF @cnt = 3 THEN
            //Here I need to loop through the rows
        ELSE
            //Do something else
        END IF;
       END$$
    
    5 cho các truy vấn và xóa,
    CREATE PROCEDURE myproc(lang char(2))
    BEGIN
        set @select = concat('SELECT * FROM ', lang, ' limit 3');
        PREPARE stm FROM @select;
        EXECUTE stm;
        DEALLOCATE PREPARE stm;
        SET @cnt = FOUND_ROWS(); 
        SELECT @cnt;
        IF @cnt = 3 THEN
            //Here I need to loop through the rows
        ELSE
            //Do something else
        END IF;
       END$$
    
    6 để cập nhật và
    CREATE PROCEDURE myproc(lang char(2))
    BEGIN
        set @select = concat('SELECT * FROM ', lang, ' limit 3');
        PREPARE stm FROM @select;
        EXECUTE stm;
        DEALLOCATE PREPARE stm;
        SET @cnt = FOUND_ROWS(); 
        SELECT @cnt;
        IF @cnt = 3 THEN
            //Here I need to loop through the rows
        ELSE
            //Do something else
        END IF;
       END$$
    
    7 để chèn.

  • Bảo vệ chống lại các cuộc tấn công tiêm SQL. Các giá trị tham số có thể chứa các ký tự trích dẫn SQL và dấu phân cách không được phân giải.

Các phần sau đây cung cấp một cái nhìn tổng quan về các đặc điểm của các câu lệnh đã chuẩn bị:

  • Báo cáo chuẩn bị trong các chương trình ứng dụng

  • Các câu lệnh được chuẩn bị trong tập lệnh SQL

  • Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

  • Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

Báo cáo chuẩn bị trong các chương trình ứng dụng

Các câu lệnh được chuẩn bị trong tập lệnh SQL

Các câu lệnh được chuẩn bị trong tập lệnh SQL

Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

  • Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

  • Bạn có thể sử dụng các câu lệnh được chuẩn bị phía máy chủ thông qua các giao diện lập trình máy khách, bao gồm Thư viện máy khách API MySQL C cho các chương trình C, Trình kết nối MySQL/J cho các chương trình Java và Trình kết nối/Net MYSQL cho các chương trình sử dụng .NET Technologies. Ví dụ: API C cung cấp một tập hợp các cuộc gọi chức năng tạo nên API câu lệnh đã chuẩn bị. Xem C Giao diện câu lệnh API. Các giao diện ngôn ngữ khác có thể cung cấp hỗ trợ cho các câu lệnh đã chuẩn bị sử dụng giao thức nhị phân bằng cách liên kết trong thư viện máy khách C, một ví dụ là tiện ích mở rộng

    CREATE PROCEDURE myproc(lang char(2))
    BEGIN
        set @select = concat('SELECT * FROM ', lang, ' limit 3');
        PREPARE stm FROM @select;
        EXECUTE stm;
        DEALLOCATE PREPARE stm;
        SET @cnt = FOUND_ROWS(); 
        SELECT @cnt;
        IF @cnt = 3 THEN
            //Here I need to loop through the rows
        ELSE
            //Do something else
        END IF;
       END$$
    
    8, có sẵn trong PHP 5.0 trở lên.mysql client program.

  • Một giao diện SQL thay thế cho các câu lệnh đã chuẩn bị có sẵn. Giao diện này không hiệu quả như sử dụng giao thức nhị phân thông qua API câu lệnh đã chuẩn bị, nhưng không yêu cầu lập trình vì nó có sẵn trực tiếp ở cấp độ SQL:

Bạn có thể sử dụng nó khi không có giao diện lập trình nào có sẵn cho bạn.

  • Bạn có thể sử dụng nó từ bất kỳ chương trình nào có thể gửi các câu lệnh SQL đến máy chủ để được thực thi, chẳng hạn như chương trình máy khách MySQL.

  • Bạn có thể sử dụng nó ngay cả khi máy khách đang sử dụng phiên bản cũ của thư viện máy khách.

  • Cú pháp SQL cho các câu lệnh đã chuẩn bị được dự định sẽ được sử dụng cho các tình huống như sau:

  • Để kiểm tra cách các câu lệnh được chuẩn bị trong ứng dụng của bạn trước khi mã hóa nó.

Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

  • Bạn có thể sử dụng các câu lệnh được chuẩn bị phía máy chủ thông qua các giao diện lập trình máy khách, bao gồm Thư viện máy khách API MySQL C cho các chương trình C, Trình kết nối MySQL/J cho các chương trình Java và Trình kết nối/Net MYSQL cho các chương trình sử dụng .NET Technologies. Ví dụ: API C cung cấp một tập hợp các cuộc gọi chức năng tạo nên API câu lệnh đã chuẩn bị. Xem C Giao diện câu lệnh API. Các giao diện ngôn ngữ khác có thể cung cấp hỗ trợ cho các câu lệnh đã chuẩn bị sử dụng giao thức nhị phân bằng cách liên kết trong thư viện máy khách C, một ví dụ là tiện ích mở rộng

    CREATE PROCEDURE myproc(lang char(2))
    BEGIN
        set @select = concat('SELECT * FROM ', lang, ' limit 3');
        PREPARE stm FROM @select;
        EXECUTE stm;
        DEALLOCATE PREPARE stm;
        SET @cnt = FOUND_ROWS(); 
        SELECT @cnt;
        IF @cnt = 3 THEN
            //Here I need to loop through the rows
        ELSE
            //Do something else
        END IF;
       END$$
    
    8, có sẵn trong PHP 5.0 trở lên.

  • Một giao diện SQL thay thế cho các câu lệnh đã chuẩn bị có sẵn. Giao diện này không hiệu quả như sử dụng giao thức nhị phân thông qua API câu lệnh đã chuẩn bị, nhưng không yêu cầu lập trình vì nó có sẵn trực tiếp ở cấp độ SQL:

  • Bạn có thể sử dụng nó khi không có giao diện lập trình nào có sẵn cho bạn.

Bạn có thể sử dụng nó từ bất kỳ chương trình nào có thể gửi các câu lệnh SQL đến máy chủ để được thực thi, chẳng hạn như chương trình máy khách MySQL.

Bạn có thể sử dụng nó ngay cả khi máy khách đang sử dụng phiên bản cũ của thư viện máy khách.

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

Cú pháp SQL cho các câu lệnh đã chuẩn bị được dự định sẽ được sử dụng cho các tình huống như sau:

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;

Để kiểm tra cách các câu lệnh được chuẩn bị trong ứng dụng của bạn trước khi mã hóa nó.

mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;

Để sử dụng các câu lệnh đã chuẩn bị khi bạn không có quyền truy cập vào API lập trình hỗ trợ chúng.

Để tương tác khắc phục sự cố ứng dụng với các câu lệnh đã chuẩn bị.

Để tạo một trường hợp thử nghiệm tái tạo một vấn đề với các câu lệnh đã chuẩn bị, để bạn có thể nộp báo cáo lỗi.

Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

Bạn có thể sử dụng các câu lệnh được chuẩn bị phía máy chủ thông qua các giao diện lập trình máy khách, bao gồm Thư viện máy khách API MySQL C cho các chương trình C, Trình kết nối MySQL/J cho các chương trình Java và Trình kết nối/Net MYSQL cho các chương trình sử dụng .NET Technologies. Ví dụ: API C cung cấp một tập hợp các cuộc gọi chức năng tạo nên API câu lệnh đã chuẩn bị. Xem C Giao diện câu lệnh API. Các giao diện ngôn ngữ khác có thể cung cấp hỗ trợ cho các câu lệnh đã chuẩn bị sử dụng giao thức nhị phân bằng cách liên kết trong thư viện máy khách C, một ví dụ là tiện ích mở rộng

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
8, có sẵn trong PHP 5.0 trở lên.

ALTER TABLE
ALTER USER
ANALYZE TABLE
CACHE INDEX
CALL
CHANGE MASTER
CHECKSUM {TABLE | TABLES}
COMMIT
{CREATE | DROP} INDEX
{CREATE | RENAME | DROP} DATABASE
{CREATE | DROP} TABLE
{CREATE | RENAME | DROP} USER
{CREATE | DROP} VIEW
DELETE
DO
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES
  | LOGS | STATUS | MASTER | SLAVE | USER_RESOURCES}
GRANT
INSERT
INSTALL PLUGIN
KILL
LOAD INDEX INTO CACHE
OPTIMIZE TABLE
RENAME TABLE
REPAIR TABLE
REPLACE
RESET {MASTER | SLAVE}
REVOKE
SELECT
SET
SHOW BINLOG EVENTS
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}
SHOW {MASTER | BINARY} LOGS
SHOW {MASTER | SLAVE} STATUS
SLAVE {START | STOP}
TRUNCATE TABLE
UNINSTALL PLUGIN
UPDATE

Một giao diện SQL thay thế cho các câu lệnh đã chuẩn bị có sẵn. Giao diện này không hiệu quả như sử dụng giao thức nhị phân thông qua API câu lệnh đã chuẩn bị, nhưng không yêu cầu lập trình vì nó có sẵn trực tiếp ở cấp độ SQL:

Bạn có thể sử dụng nó khi không có giao diện lập trình nào có sẵn cho bạn.

  • DECLARE cursor_name CURSOR FOR select_statement
    3,
    DECLARE cursor_name CURSOR FOR select_statement
    4

  • DECLARE cursor_name CURSOR FOR select_statement
    5,
    DECLARE cursor_name CURSOR FOR select_statement
    6

  • Các câu lệnh chứa bất kỳ tham chiếu nào đến biến hệ thống

    DECLARE cursor_name CURSOR FOR select_statement
    7 hoặc
    DECLARE cursor_name CURSOR FOR select_statement
    8.

Nói chung, các tuyên bố không được phép trong các tuyên bố chuẩn bị SQL cũng không được phép trong các chương trình lưu trữ. Các trường hợp ngoại lệ được ghi nhận trong Phần & NBSP; 25.8, Hạn chế trên các chương trình được lưu trữ.

Các thay đổi siêu dữ liệu đối với các bảng hoặc chế độ xem được đề cập bởi các câu lệnh đã chuẩn bị được phát hiện và gây ra sự phục hồi tự động của câu lệnh khi nó được thực hiện tiếp theo. Để biết thêm thông tin, hãy xem Phần & NBSP; 8.10.3, Bộ nhớ đệm của các câu lệnh đã chuẩn bị và các chương trình được lưu trữ.

Người giữ chỗ có thể được sử dụng cho các đối số của mệnh đề

DECLARE cursor_name CURSOR FOR select_statement
9 khi sử dụng các câu lệnh được chuẩn bị. Xem Phần & NBSP; 13.2.10, Câu lệnh Chọn.

Trong các câu lệnh

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
0 được sử dụng với
CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
9 và
DECLARE cursor_name CURSOR FOR select_statement
0, hỗ trợ giữ chỗ cho các tham số
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
3 và
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
4 có sẵn bắt đầu với MySQL 8.0. Xem Phần & NBSP; 13.2.1, Tuyên bố Call Call, cho một ví dụ và cách giải quyết cho các phiên bản trước. Người giữ chỗ có thể được sử dụng cho các tham số
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
5 bất kể phiên bản.

Cú pháp SQL cho các câu lệnh đã chuẩn bị không thể được sử dụng trong thời trang lồng nhau. Đó là, một tuyên bố được truyền cho

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
9 không thể là một câu lệnh
CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
9,
DECLARE cursor_name CURSOR FOR select_statement
0 hoặc
DECLARE cursor_name CURSOR FOR select_statement
1.

Cú pháp SQL cho các câu lệnh đã chuẩn bị khác với việc sử dụng các cuộc gọi API câu lệnh đã chuẩn bị. Ví dụ: bạn không thể sử dụng chức năng API

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
0 C để chuẩn bị câu lệnh
CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
9,
DECLARE cursor_name CURSOR FOR select_statement
0 hoặc
DECLARE cursor_name CURSOR FOR select_statement
1.

Cú pháp SQL cho các câu lệnh đã chuẩn bị có thể được sử dụng trong các quy trình được lưu trữ, nhưng không phải trong các chức năng hoặc kích hoạt được lưu trữ. Tuy nhiên, một con trỏ không thể được sử dụng cho một câu lệnh động được chuẩn bị và thực thi với

CREATE PROCEDURE myproc(lang char(2))
BEGIN
    set @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
        //Here I need to loop through the rows
    ELSE
        //Do something else
    END IF;
   END$$
9 và
DECLARE cursor_name CURSOR FOR select_statement
0. Tuyên bố cho một con trỏ được kiểm tra tại thời gian tạo con trỏ, vì vậy câu lệnh không thể năng động.

Cú pháp SQL cho các câu lệnh đã chuẩn bị không hỗ trợ nhiều câu chuyện (nghĩa là nhiều câu lệnh trong một chuỗi được phân tách bởi

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
6 ký tự).

Để viết các chương trình C sử dụng câu lệnh

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
0 SQL để thực hiện các quy trình được lưu trữ có chứa các câu lệnh đã chuẩn bị, cờ
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
8 phải được bật. Điều này là do mỗi
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
0 trả về kết quả để chỉ ra trạng thái cuộc gọi, ngoài bất kỳ bộ kết quả nào có thể được trả về bởi các câu lệnh được thực thi trong quy trình.

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
8 có thể được bật khi bạn gọi
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;
1, rõ ràng bằng cách vượt qua cờ
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
8 hoặc hoàn toàn bằng cách vượt qua
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;
3 (cũng cho phép
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
8). Để biết thêm thông tin, xem Phần & NBSP; 13.2.1, Tuyên bố cuộc gọi.