Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menggunakan pernyataan yang disiapkan dengan kursor

Beberapa aturan:

  1. Semua deklarasi harus berada di satu tempat secara berurutan.
  2. Anda tidak dapat menggunakan nama variabel dalam deklarasi kursor .
  3. Deklarasi handler harus setelah deklarasi kursor.
  4. Anda tidak dapat menggunakan nama variabel lokal (id ) sebagai parameter terikat untuk pernyataan yang disiapkan. Anda hanya dapat menggunakan session variabel (misalnya @_id ).

Untuk mengatasi masalah tersebut, Anda dapat mengadopsi solusi berikut.

  1. Tentukan tabel sementara menggunakan parameter input ke SP.
  2. Sekarang deklarasikan kursor pada tabel yang sama dan gunakan.
  3. Lepaskan tabel sementara yang dibuat.

Contoh berikut harus bekerja di tabel Anda.

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 ;

Sekarang panggil prosedur dengan table_id nilai.

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. Mengurutkan hasil kueri mysql

  2. Mysql - Cara mengetahui tingkat isolasi untuk transaksi

  3. Permintaan hasil pencarian berbasis lokasi yang lambat

  4. Bagaimana cara melewatkan variabel sesi di url JDBC dengan benar?

  5. Mysql:Urutan hasil dengan pilih <fieldname> dari berbeda dengan urutan hasil dengan pilih * dari