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

Vòng lặp qua các tập kết quả trong MySQL

Một cái gì đó như thế này sẽ thực hiện một mẹo nhỏ (Tuy nhiên, hãy đọc sau đoạn mã để biết thêm thông tin)

CREATE PROCEDURE GetFilteredData()
BEGIN
  DECLARE bDone INT;

  DECLARE var1 CHAR(16);    -- or approriate type
  DECLARE Var2 INT;
  DECLARE Var3 VARCHAR(50);

  DECLARE curs CURSOR FOR  SELECT something FROM somewhere WHERE some stuff;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

  DROP TEMPORARY TABLE IF EXISTS tblResults;
  CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
    --Fld1 type,
    --Fld2 type,
    --...
  );

  OPEN curs;

  SET bDone = 0;
  REPEAT
    FETCH curs INTO var1,, b;

    IF whatever_filtering_desired
       -- here for whatever_transformation_may_be_desired
       INSERT INTO tblResults VALUES (var1, var2, var3 ...);
    END IF;
  UNTIL bDone END REPEAT;

  CLOSE curs;
  SELECT * FROM tblResults;
END

Một số điều cần xem xét ...

Liên quan đến đoạn mã trên:

  • có thể muốn chuyển một phần truy vấn đến Thủ tục đã lưu trữ, có thể đặc biệt là tiêu chí tìm kiếm, để làm cho nó chung chung hơn.
  • Nếu phương thức này được gọi bởi nhiều phiên, v.v. có thể muốn chuyển một ID phiên theo kiểu sắp xếp để tạo tên bảng tạm thời duy nhất (thực sự là mối quan tâm không cần thiết vì các phiên khác nhau không chia sẻ cùng một không gian tên tệp tạm thời; xem nhận xét của Gruber, bên dưới)
  • Một số phần như khai báo biến, truy vấn SELECT, v.v. cần được chỉ định chính xác

Tổng quát hơn: cố gắng tránh cần con trỏ .

Tôi cố tình đặt tên cho biến con trỏ là curs [e], bởi vì con trỏ là một sự may mắn hỗn hợp. Chúng có thể giúp chúng ta triển khai các quy tắc nghiệp vụ phức tạp có thể khó diễn đạt ở dạng khai báo của SQL, nhưng sau đó nó đưa chúng ta sử dụng dạng thủ tục (mệnh lệnh) của SQL, đây là một tính năng chung của SQL không thân thiện lắm / biểu cảm, khôn ngoan về lập trình và thường kém hiệu quả hơn về hiệu suất.

Có thể bạn có thể xem xét việc thể hiện sự chuyển đổi và lọc mong muốn trong ngữ cảnh của một truy vấn SQL "thuần túy" (mang tính khai báo).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao một cột văn bản không thể có giá trị mặc định trong MySQL?

  2. Cách tạo Rest API với Spring Boot bằng MySQL và JPA

  3. Nhập tệp SQL vào mysql

  4. xampp MySQL không khởi động

  5. SQL DELETE với THAM GIA một bảng khác cho điều kiện WHERE