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

Sử dụng các câu lệnh đã chuẩn bị với con trỏ

Một số quy tắc:

  1. Tất cả các khai báo phải ở cùng một nơi trong một trình tự.
  2. Bạn không thể sử dụng tên biến trong khai báo con trỏ .
  3. Khai báo trình xử lý phải sau khai báo con trỏ.
  4. Bạn không thể sử dụng tên biến cục bộ (id ) dưới dạng tham số ràng buộc cho các câu lệnh chuẩn bị trước. Bạn chỉ có thể sử dụng session biến (giả sử @_id ).

Để khắc phục những vấn đề như vậy, bạn có thể áp dụng giải pháp sau.

  1. Xác định một bảng tạm thời bằng cách sử dụng tham số đầu vào cho SP.
  2. Bây giờ khai báo con trỏ trên cùng một bảng và sử dụng nó.
  3. Thả bảng tạm thời đã tạo.

Ví dụ sau sẽ hoạt động trên các bảng của bạn.

delimiter $$

drop procedure if exists test2$$

create procedure test2( table_id varchar(25) )
begin
  set @temp_query = 'drop temporary table if exists temp_cursor_table';
  prepare pst from @temp_query;
  execute pst;
  drop prepare pst; -- or
  -- deallocate prepare pst;

  set @temp_table_query='create temporary table temp_cursor_table ';
  set @temp_table_query=concat( @temp_table_query, ' select entryId from ' );
  set @temp_table_query=concat( @temp_table_query, table_id );
  set @temp_table_query=concat( @temp_table_query, ' order by entryId' );

  prepare pst from @temp_table_query;
  execute pst;
  drop prepare pst;

  -- now write your actual cursor and update statements
  -- in a separate block
  begin
    declare done int default false;
    declare id int;
    declare id_new int;
    declare stmt1 varchar(1024);
    declare stmt2 varchar(1024);

    declare getid cursor for  
              select entryId from temp_cursor_table order by entryId;
    declare continue handler for not found set done = 1;

    set @id_new = 1; 

    open getid;
    fetch getid into id;
    repeat
      set @sqltext2 := concat( 'update ', table_id );
      set @sqltext2 := concat( @sqltext2, ' set entryId = ? where entryId = ?' );
      set @_id = id;
      prepare stmt2 from @sqltext2;
      execute stmt2 using @new_id, @_id;
      set @id_new = @id_new + 1;
      fetch getid into id;
    until done end repeat;
    close getid;
  end;
end;
$$

delimiter ;

Bây giờ hãy gọi thủ tục với table_id giá trị.

call test2( 'Test' );



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cân nhắc về tính toàn vẹn và hiệu suất của dữ liệu trong sao chép bán đồng bộ MySQL

  2. tại sao pdo-> lastInsertId () trả về 0 khi tôi gọi QUY TRÌNH ĐƯỢC LƯU TRỮ trong mysql?

  3. chèn dữ liệu từ JSON vào mysql bằng php

  4. MySQL chọn một trường từ bảng điều kiện WHERE nằm trong nhiều hàng

  5. lỗ hổng mysql_escape_string