Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Gọi một thủ tục được lưu trữ cho mỗi hàng được trả về bởi một truy vấn trong MySQL

Các khái niệm như “vòng lặp” (cho-mỗi, trong khi, v.v.) và “phân nhánh” (nếu-khác, cuộc gọi, v.v.) là thủ tục và không tồn tại trong khai báo ngôn ngữ như SQL. Thông thường người ta có thể diễn đạt kết quả mong muốn của một người theo cách khai báo, đó sẽ là cách chính xác để giải quyết vấn đề này.

Ví dụ:nếu testProc thủ tục sẽ được gọi sử dụng id đã cho làm khóa tra cứu vào một bảng khác, sau đó bạn có thể (và nên) thay vào đó chỉ cần JOIN các bảng của bạn lại với nhau — ví dụ:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

Thay vào đó, chỉ trong những tình huống cực kỳ hiếm gặp mà vấn đề của bạn không thể được diễn đạt một cách khai báo thì bạn mới nên sử dụng cách giải quyết vấn đề theo thủ tục. Đã lưu trữ thủ tục là cách duy nhất để thực thi mã thủ tục trong MySQL. Vì vậy, bạn cần phải sửa đổi mầm hiện có của mình để nó thực hiện logic hiện tại trong một vòng lặp hoặc nếu không, hãy tạo một mầm mới gọi cái hiện có của bạn từ trong một vòng lặp:

CREATE PROCEDURE foo() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id BIGINT UNSIGNED;
  DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _id;
    IF done THEN
      LEAVE testLoop;
    END IF;
    CALL testProc(_id);
  END LOOP testLoop;

  CLOSE cur;
END



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ chọn giá trị cuối cùng bằng cách sử dụng nhóm của tại mysql

  2. Phân vùng cơ sở dữ liệu và phân vùng

  3. Đánh dấu văn bản tìm kiếm trong tìm kiếm php mysql

  4. Cách lấy id được chèn lần cuối từ bảng MySQL

  5. Sử dụng MySql, tôi có thể sắp xếp một cột nhưng có số 0 ở cuối cùng không?