1

移行プログラムを開発中です。DB には 8000 万近くのレコードがあります。コードは次のとおりです。

static int mymigration(struct progargs *args) 
{
  exec sql begin declare section;
    const char *selectQuery;
    const char *updateQuery;
    long cur_start;
    long cur_end;
    long serial;
    long number;
    char frequency[3];
  exec sql end declare section;

    selectQuery = "select * from mytable where number >= ? and number <= ? for update of frequency ,status";
    updateQuery = "update mytable set frequency = ?, "
    " status = ? "
    " where current of my_cursor";

    cur_start= args->start;
    cur_end = args->end;

    exec sql prepare my_select_query from :selectQuery;
    /* Verify the sql code for error here */

    exec sql declare my_select_cursor cursor with hold for my_select_query;

    exec sql open my_select_cursor using :cur_start, :cur_end;
    /* Verify the sql code for error here */

    exec sql prepare my_update_query from :updateQuery;
    /* Verify the sql code for error here */        

    while (1)
    {
            number = 0;
            serial = 0;
            memset(frequency,0,sizeof(frequency));

            exec sql fetch my_select_cursor into number,:serial,:frequency;
            if (sqlca.sqlcode != SQL_OK)
                    break;            

            exec sql execute my_update_query using :frequency, :frequency;

    }      
    exec sql close my_select_trade_cursor;

}

これを実装すると、エラー メッセージ "-255" が表示されます。仕事を追加して仕事をコミットするという1つの解決策を見つけました。大量のデータがあるため、トランザクション ログが乱雑になる可能性があります。

この問題に利用できる他の解決策はありますか? Informix の IBM Web サイトは、使用法が正しいことを示しています。

事前に助けに感謝します。

ありがとう、マシュー・リジュ

4

1 に答える 1

0

エラー -255 は「トランザクション中ではありません」です。

BEGIN WORK (または COMMIT WORK または ROLLBACK WORK) ステートメントが表示されません。

FOR UPDATE 句でカーソルを開く前に、BEGIN WORK を追加する必要があります。次に、過度に長いトランザクションを避けるために定期的にコミットするかどうかを決定する必要があります。FOR HOLD カーソルを使用するという事実は、サブトランザクションの使用を考えていたことを示しています。そうするつもりがないなら、その条項を使用しないでしょう。

Informix には 3 つのプライマリ データベース ロギング モードがあることに注意してください。

  • ログなし (トランザクション サポートなし)
  • ログに記録されます (デフォルトでは、各ステートメントはシングルトン トランザクションです。明示的な BEGIN WORK は、COMMIT WORK または ROLLBACK WORK によって終了する複数ステートメントのトランザクションを開始します)。
  • ログに記録された MODE ANSI (少し単純化すると、自動的にトランザクションに入ります。トランザクションを終了するには、明示的な COMMIT または ROLLBACK が必要です。その後、オプションで明示的な BEGIN を使用できますが、BEGIN は実際には必要ありません)。

あなたが説明した症状から、ログには記録されていますが、MODE ANSI データベースはありません。したがって、BEGIN WORK ステートメントを明示的にコーディングする必要があります。

于 2010-02-22T19:09:39.103 に答える