Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando instruções preparadas com cursor


Algumas regras:
  1. Todas as declarações devem estar em um lugar em uma sequência.
  2. Você não pode usar nomes de variáveis ​​nas declarações do cursor .
  3. As declarações do manipulador devem estar após as declarações do cursor.
  4. Você não pode usar nomes de variáveis ​​locais (id ) como parâmetros vinculados para instruções preparadas. Você só pode usar session variáveis ​​(digamos @_id ).

Para superar tais problemas, você pode adotar a seguinte solução.
  1. Defina uma tabela temporária usando o parâmetro de entrada para o SP.
  2. Agora declare o cursor na mesma tabela e use-o.
  3. Retire a tabela temporária criada.

O exemplo a seguir deve funcionar em suas tabelas.
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 ;

Agora chame o procedimento com table_id valor.
call test2( 'Test' );