データをフェッチしてフィルター処理し、それをDB2 AS400のQTEMPライブラリーの一時テーブル(P6SUBFCH)に保管するC++プログラムを開発しています。
これを行う理由は、一度に64レコードのブロックでデータをフェッチするメソッドが定義されているPLEXを使用するため、SQLBlockFetchと呼ばれる関数がすべてのレコードを一時テーブルにフェッチし、一度に64レコードのみが返されるようにするためです。この一時テーブルから、そのように処理されます。
私は独自のSQLBockfetchを開発しており、そのC ++部分は、すべてのSQLクエリを実行するために埋め込みSQLを使用しています。これは、QTEMPライブラリにテーブル(P6SUBFCH)を作成するすべてのデータをフェッチしています。
QTEMPライブラリはセッションに対してアクティブであり、セッションが終了するとすぐに、すべてのテーブルがそのライブラリにドロップされます。
また、QTEMPのすべてのテーブルがジャーナル化されているわけではなく、私がgoogleで調査したところ、ジャーナル化できないことにも注意してください。
問題
私のC++プログラムは、セッションで最初に呼び出されたときにうまく機能しますが、2回目は、テーブルQTEMP/P6SUBFCHの前のデータにデータを追加するだけです。これは問題です。最初にデータをクリアしようとしましたが(SQL DELETEステートメント)、AS400ジョブログでこのSQLエラーが発生します。
Member P6SUBFCH not journaled to journal *N.
P6SUBFCH in QTEMP not valid for operation.
SQLエラー:-7008
私は次のql7008-error-workaroundを読みました
トランザクション分離を無効にするには
これが私の問題なのかわからない?私はまだ埋め込みSQLを初めて使用しますが、これをどのように行うかはわかりません。
これが私のコードです:
void LinkRepository::SaveResultsToTable(InputParameters inputParameters)
{
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char Query2[2000] = { "" };
char Query3[2000] = { "" };
EXEC SQL END DECLARE SECTION;
strcpy(Query2, "CREATE TABLE QTEMP/P6SUBFCH");
strcat(Query2, " (PAOPIID CHAR(21) NOT NULL,");
strcat(Query2, " POPITPE CHAR(10),");
strcat(Query2, " POPISTPE CHAR(10),");
strcat(Query2, " POPIKNID CHAR(20),");
strcat(Query2, " PINSTAT CHAR(10),");
strcat(Query2, " PLEAFIND CHAR(1),");
strcat(Query2, " CLOPIID CHAR(21),");
strcat(Query2, " COPITPE CHAR(10),");
strcat(Query2, " COPISTPE CHAR(10),");
strcat(Query2, " COPIKNID CHAR(20),");
strcat(Query2, " CINSTAT CHAR(10),");
strcat(Query2, " CLEAFIND CHAR(1),");
strcat(Query2, " LINKIN CHAR(10))");
EXEC SQL EXECUTE IMMEDIATE :Query2;
// Error handling
if (sqlca.sqlcode == -601)
{
strcpy(Query2, "DELETE FROM QTEMP/P6SUBFCH");
EXEC SQL EXECUTE IMMEDIATE :Query2;
}
EXEC SQL COMMIT;
// Datalinks is a vector that has all the filter data to insert into the QTEMP/P6SUBFCH table
for(vector<Datalink*>::iterator dl = Datalinks.begin(); dl != Datalinks.end(); ++dl)
{
EXEC SQL SET TRANSACTION ISOLATION LEVEL NO COMMIT;
strcpy(Query3, "INSERT INTO QTEMP/P6SUBFCH (PAOPIID,POPITPE,");
strcat(Query3, "POPISTPE,POPIKNID,PINSTAT,PLEAFIND,");
strcat(Query3, "CLOPIID,COPITPE,COPISTPE,COPIKNID,CINSTAT,");
strcat(Query3, "CLEAFIND,LINKIN)");
strcat(Query3, "VALUES('");
strcat(Query3, (*dl)->ParentOperationsItemId);
strcat(Query3, "','");
strcat(Query3, (*dl)->ParentOperationsItemType);
strcat(Query3, "','");
strcat(Query3, (*dl)->ParentOperationsItemSubType);
strcat(Query3, "','");
strcat(Query3, (*dl)->ParentKnownbyId);
strcat(Query3, "','");
strcat(Query3, (*dl)->ParentInternalStatus);
strcat(Query3, "','");
append_char(Query3, (*dl)->ParentLeafIndicator);
strcat(Query3, "','");
strcat(Query3, (*dl)->ChildOperationsItemId);
strcat(Query3, "','");
strcat(Query3, (*dl)->ChildOperationsItemType);
strcat(Query3, "','");
strcat(Query3, (*dl)->ChildOperationsItemSubType);
strcat(Query3, "','");
strcat(Query3, (*dl)->ChildKnownbyId);
strcat(Query3, "','");
strcat(Query3, (*dl)->ChildInternalStatus);
strcat(Query3, "','");
append_char(Query3, (*dl)->ChildLeafIndicator);
strcat(Query3, "','");
strcat(Query3, (*dl)->LinkInternalStatus);
strcat(Query3, "')");
EXEC SQL EXECUTE IMMEDIATE :Query3;
EXEC SQL COMMIT;
}
};