データベース・プロトコル - トラブルシューティングと制限事項
本項では,データベース・プロトコルのトラブルシューティングと制限事項について説明します。
ヒント: VuGen の一般的なトラブルシューティングと制限事項については,「VuGen の既知の問題」を参照してください。
このトピックの内容:
すべてのデータベース・プロトコルのトラブルシューティング
エラー・コードの評価
仮想ユーザが LRD 関数を実行すると,リターン・コードが生成されます。リターン・コード 0 は,関数が成功したことを示します。たとえば,リターン・コードが 0 のときには,結果セットの別の行が利用できます。エラーが発生した場合,リターン・コードはエラーのタイプを示します。たとえば,リターン・コード 2014 は,初期化でエラーが発生したことを示します。
リターン・コードは,数値の範囲に基づいて 4 つのタイプに分かれています。
リターン・コードのタイプ
![]() |
範囲
![]() |
---|---|
情報
|
0 ~ 999
|
警告
|
1000 ~ 1999
|
エラー
|
2000 ~ 2999
|
内部エラー
|
5000 ~ 5999
|
リターン・コードの詳細については,関数リファレンスを参照してください。
LRD 関数のリターン・コードを評価して,関数が成功したかどうかを確認できます。次のスクリプト・セグメントは,lrd_fetch 関数のリターン・コードを評価しています。
static int rc; rc=lrd_fetch(Csr15, -13, 0, 0, PrintRow4, 0); if (rc==0) lr_output_message("The function succeeded"); else lr_output_message("The function returned an error code:%d",rc);
2 層データベースのスクリプティングに関するヒント
本項では,2 層データベースのスクリプトに関する解決方法を示します。
Oracle 2 層仮想ユーザのトラブルシューティング
本項では,Oracle の仮想ユーザを使用するときに発生する一般的な問題と,その推奨される解決策を示します。
ORA-20001 と ORA-06512
lrd_stmt に PL/SQL ブロック fnd_signon.audit_responsibility(...) が含まれている場合,再生中にエラー ORA-20001 と ORA-06512 が発生します。
新規に接続が行われるたびに異なるサインオン番号が使用されるため,再生中にこのステートメントは失敗します。
解決策
この問題を解決するには,サインオン番号に新しい相関ツールを使用する必要があります。サインオン番号は,ステートメント内で 2 番目に割り当てられる値です。
相関できる値をスキャンした後,失敗したステートメントの 2 番目の lrd_assign_bind() の値に着目します。なお,[相関クエリ]ウィンドウの値の順序は,実際に記録されたステートメントの順序と異なる場合があります。
置換後の値を含むグリッドは,PL/SQL ブロック fnd_signon.audit_user(...) を含む lrd_stmt の後に出現します。
注: サインオン番号は接続ごとに異なるため,新規接続を記録するたびに相関を使用する必要があります。
解決策の例
次のステートメントは,2 番目の値「1498224」が設定されているため,再生に失敗します。この値はサインオン番号であり,新しく接続が行われるたびに異なる値でなければなりません。
lrd_stmt(Csr6, "begin fnd_signon.audit_responsibility(:s,:l,:f,:a,:r,:t,:p)"
"; end;", -1, 1, 1, 0);
lrd_assign_bind(Csr6, "s", "D", =;s_D216, 0, 0, 0);
lrd_assign_bind(Csr6, "l", "1498224", =;l_D217, 0, 0, 0);
lrd_assign_bind(Csr6, "f", "1", =;f_D218, 0, 0, 0);
lrd_assign_bind(Csr6, "a", "810", =;a_D219, 0, 0, 0);
lrd_assign_bind(Csr6, "r", "20675", =;r_D220, 0, 0, 0);
lrd_assign_bind(Csr6, "t", "Windows PC", =;t_D221, 0, 0, 0);
lrd_assign_bind(Csr6, "p", "", =;p_D222, 0, 0, 0);
lrd_exec(Csr6, 1, 0, 0, 0, 0);
サインオン番号は,「fnd_signon.audit_user」を含む lrd_stmt に存在します。最初のプレースホルダ「a」の値が保存されているはずです。「a」の入力は常に「0」ですが,出力は要求された値です。
変更後のコード:
lrd_stmt(Csr4, "begin fnd_signon.audit_user(:a,:l,:u,:t,:n,:p,:s); end;", -1, 1, 1, 0);
lrd_assign_bind(Csr4, "a", "0", =;a_D46, 0, 0, 0);
lrd_assign_bind(Csr4, "l", "D", =;l_D47, 0, 0, 0);
lrd_assign_bind(Csr4, "u", "1001", =;u_D48, 0, 0, 0);
lrd_assign_bind(Csr4, "t", "Windows PC", =;t_D49, 0, 0, 0);
lrd_assign_bind(Csr4, "n", "OraUser", =;n_D50, 0, 0, 0);
lrd_assign_bind(Csr4, "p", "", =;p_D51, 0, 0, 0);
lrd_assign_bind(Csr4, "s", "14157", =;s_D52, 0, 0, 0);
lrd_exec(Csr4, 1, 0, 0, 0, 0);
lrd_save_value(=;a_D46, 0, 0, " saved_a_D46");
Grid0(17);
lrd_stmt(Csr6, "begin fnd_signon.audit_responsibility(:s,:l,:f,:a,:r,:t,:p)"
"; end;", -1, 1, 1, 0);
lrd_assign_bind(Csr6, "s", "D", =;s_D216, 0, 0, 0);
lrd_assign_bind(Csr6, "l", " <saved_a_D46>", =;l_D217, 0, 0, 0);
lrd_assign_bind(Csr6, "f", "1", =;f_D218, 0, 0, 0);
lrd_assign_bind(Csr6, "a", "810", =;a_D219, 0, 0, 0);
lrd_assign_bind(Csr6, "r", "20675", =;r_D220, 0, 0, 0);
lrd_assign_bind(Csr6, "t", "Windows PC", =;t_D221, 0, 0, 0);
lrd_assign_bind(Csr6, "p", "", =;p_D222, 0, 0, 0);
lrd_exec(Csr6, 1, 0, 0, 0, 0);
大きい数値の処理
大きい数値(NUMBER データ・タイプ)の表示形式が,グリッド・ファイルと ASCII ファイルで異なる場合があります。この違いによって,相関のために保存する値を検索するときに,数値の識別が困難になります。
たとえば,グリッドで 1000003 と表示される値が,記録ログ(ASCII ファイル)では 1e+0006 と表示されます。
回避策
再生中にエラーが発生し,相関ツールが前回の結果から値を検索できない場合,グリッドを使用して別の形式で値を検索してください。
ORA-00960
このエラーは,カラム名が一意でない場合に発生する可能性があります。次に例を示します。
lrd_stmt(Csr9, "SELECT UOM_CODE, UOM_CODE, DESCRIPTION FROM "
"MTL_UNITS_OF_MEASURE "
"WHERE NVL(DISABLE_DATE, SYSDATE + 1) > "
"SYSDATE ORDER BY UOM_CODE", -1, 1, 1, 0);
この場合,次のエラーが表示されます。
「lrdo.c/fjParse: "oparse" ERROR return-code=960, oerhms=ORA-00960: ambiguous column naming in select list.」
回避策
ステートメントを次のように変更します。一意でないカラム 1 つ以上にエイリアスを追加し,そのエイリアスに一意の名前を新たに与えます。次に例を示します。
lrd_stmt(Csr9,"SELECT UOM_CODE,UOM_CODE second, DESCRIPTION FROM"
"MTL_UNITS_OF_MEASURE "
"WHERE NVL(DISABLE_DATE, SYSDATE + 1) > "
"SYSDATE ORDER BY UOM_CODE", -1, 1, 1, 0);
代替の回避策: lrd ステートメントから ORDER BY を削除します。
ORA-2002
エラー 2002 は,開いていないカーソルの使用を試みたときに表示されます。このエラーは,ユーザを繰り返し再生する際,スクリプトの複数のセクションに記録が行われている場合に発生します。
具体的に言えば,vuser_init セクションでカーソルを開き,Actions セクションでカーソルを閉じる場合,2 回目の反復でカーソルを使用しようとすると,このエラーが発生します。これは,閉じたカーソルが再び開かないためです。
次に例を示します。vuser_init セクションに lrd_open_cursor があり,Actions セクションに lrd_close_cursor があると仮定します。このユーザを繰り返し再生する場合,2 回目の反復でエラーが発生します。これは,開いていないカーソルを使用しようとするためです(つまり,1 回目で閉じたカーソルを 2 回目に再び開いていないため)。
回避策
この問題を解決する最も簡単な方法は,問題のカーソルの lrd_close_cursor または lrd_close_connection,あるいはその両方を vuser_end セクションに移動することです。
データベース・プロトコル(lrd)
記録された非同期処理を再生することはできません。
クライアント・バージョンの誤り
誤ったバージョンの Oracle クライアントを実行すると,エラー・メッセージが表示される場合があります。
「エラー: lrdo_open_connection: "olog" LDA/CDA リターン コード_ 019: ユーザー側のメモリを割当てできません」
回避策
製品の bin フォルダにある lrd.ini ファイルのライブラリ情報を変更する必要があります。このファイルには,記録または再生中にロードするデータベース・サポートのバージョンが指定されています。このファイルは,ホストのタイプ別にセクションが分かれています。
たとえば,lrd.ini ファイルの次のセクションは,Windows NT の Oracle に関するセクションです。
[ORACLE_WINNT]
805=lrdo32.dll+ora805.dll
816=lrdo32.dll+oci.dll
815=lrdo32.dll+oraclient8.dll
804=lrdo32.dll+ora804.dll
803=lrdo32.dll+ora803.dll
73=lrdo32.dll+ora73.dll
72=lrdo32.dll+ora72.dll
71=lrdo32.dll+orant71.dll
ここでは,クライアントが Oracle 8.0.5 を使用する場合は仮想ユーザには ora805.dll ライブラリを使用し,クライアントが Oracle 8.1.6 を使用する場合は仮想ユーザには oci.dll を使用する,などのように設定されています。