2

私はCで次のコードを書きました:

EXEC SQL begin declare section;
    int     A;
    char    B[5];
    int     C;
    int     D;
    dtime_t E;
    char    F[13];
EXEC SQL END DECLARE SECTION;
char E_dt[16];
D=0;
memset(F, 0, sizeof(F));          

EXEC SQL declare log3 cursor for select A, B, C, D, E, F from tbl WHERE C=123;
if(sqlca.sqlcode) 
{
    return;
}

EXEC SQL fetch log3
    into
     :A, :B, :C, :D, :E, :F, 
if(sqlca.sqlcode) 
{
    if (sqlca.sqlcode != DB_NORECORDS) 
    {
        return;
    }
    break;
}

このコードを実行すると、テーブル tbl で F の値が Null になります。エラー コード 1405 が表示されます。デフォルト値を 0 に設定する memset 関数を試しましたが、うまくいきませんでした。もう 1 つ、一度に 90 を超えるフィールドを取得できます。これを実行しようとすると、コンパイル時にバス エラーが発生します。よろしくお願いします。

4

1 に答える 1

3

2 つの基本的なオプションがあります。

  1. インジケーターを使用して、NULL の存在を記録します。NULL が発生したときに特定のアクションを実行する場合は、おそらくこのオプションを使用する必要があります。
  2. NVL 関数を使用して、取得した NULL をゼロや空白などの別の値に変換します。これが最も簡単な解決策です。

編集:

log3 カーソルの NVL の例。必要なデフォルト値を選択してください。この例では、文字フィールドに ' '、数値フィールドに 0、日付に 1 月 1 日 1 を使用しています。

EXEC SQL declare log3 cursor for select NVL(A, 0), 
                                        NVL(B, ' '), 
                                        NVL(C, 0), 
                                        NVL(D, 0), 
                                        NVL(E, to_date('0001', 'YYYY')),
                                        NVL(F, ' ')
                                   from tbl 
                                  WHERE C=123;
于 2012-09-18T08:01:39.003 に答える