sql >> データベース >  >> RDS >> Mysql

カーソルでプリペアドステートメントを使用する

    いくつかのルール:

    1. すべての宣言は、シーケンス内の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. wf_java_deferredキューを再構築する方法

    2. sqlalchemyとpostgresqlでのエンコードエラー

    3. 巨大なblobデータをクエリする方法

    4. Android Studio getSlotFromBufferLocked:不明なバッファーエラー