Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на подготвени отчети с курсор

Някои правила:

  1. Всички декларации трябва да са на едно място в последователност.
  2. Не можете да използвате имена на променливи в декларациите на курсора .
  3. Декларациите на манипулатора трябва да са след декларациите на курсора.
  4. Не можете да използвате имена на локални променливи (id ) като обвързани параметри за подготвени изрази. Можете да използвате само session променливи (да кажем @_id ).

За да преодолеете подобни проблеми, можете да приемете следното решение.

  1. Дефинирайте временна таблица, като използвате входния параметър към SP.
  2. Сега декларирайте курсора на същата таблица и го използвайте.
  3. Премахнете създадената временна таблица.

Следният пример трябва да работи на вашите маси.

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 ;

Сега извикайте процедурата с table_id стойност.

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. mysql грешка 1066

  2. Извличане на MySQL полета от ред в PHP променливи и масив

  3. SQL заявка, където полето НЕ съдържа $x

  4. Проверете кои идентификатори от набор не съществуват в таблица

  5. Как да подстроите колона на MySQL таблица