16

id自動インクリメント PKと呼ばれる列を削除したいと考えています。

SQL:

alter table "CO88GT"."XGLCTL" drop column id cascade;

そして私は得る:

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.

SQLState:  57014

ErrorCode: -952

私は間違っているかもしれませんが、テーブルがデータを失うのを防ぐことに関係していると思います。この問題を回避するには、列のない新しいテーブルを作成し、古いテーブルから新しいテーブルにデータをコピーしてから、古いテーブルを新しいテーブルに置き換える必要があります。

4

6 に答える 6

23

情報

AS400 は、データ損失の可能性があるため警告 (問い合わせメッセージ) を表示し、要求された操作をキャンセルまたは無視するよう求めています。したがって、これは対話型の要求であるため、JDBC/ODBC では「I」と入力して無視することはできず、AS は ErrorCode: -952 with SQLState: 57014 および理由コード 10 をスローします。

SQL0952のドキュメントには次のように書かれています。

Message Text:   Processing of the SQL statement ended. Reason code &1.
Cause Text:     The SQL operation was ended before normal completion. The reason code is &1. Reason codes and their meanings are:

* 1 - An SQLCancel API request has been processed, for example from ODBC.
* 2 - SQL processing was ended by sending an exception.
* 3 - Abnormal termination.
* 4 - Activation group termination.
* 5 - Reclaim activation group or reclaim resources.
* 6 - Process termination.
* 7 - An EXIT function was called.
* 8 - Unhandled exception.
* 9 - A Long Jump was processed.
* 10 - A cancel reply to an inquiry message was received.
* 11 - Open Database File Exit Program (QIBM_QDB_OPEN).
* 0 - Unknown cause.

JDBC を使用していて、SQL エラーが自明ではない場合は、パラメーター ' errors=full ' を使用して JDBC 接続を作成できます。これにより、エラーに関するより多くの情報が得られます。その他の接続パラメーターについては、こちらを参照してください。

接続文字列の例:

jdbc:as400://serverName;libraries=*libl;naming=system; エラー=フル;

その接続では、結果のエラーは次のようになります。

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.
Cause . . . . . :   The SQL operation was ended before normal completion.
The reason code is 10.
Reason codes and their meanings are:
1 -- An SQLCancel API request has been processed, for example from ODBC.
2 -- SQL processing was ended by sending an exception.
3 -- Abnormal termination.
4 -- Activation group termination.
5 -- Reclaim activation group or reclaim resources.
6 -- Process termination.
7 -- An EXIT function was called.
8 -- Unhandled exception.
9 -- A Long Jump was processed.
10 -- A cancel reply to an inquiry message was received.
11 -- Open Database File Exit Program (QIBM_QDB_OPEN).
0 -- Unknown cause.
Recovery  . . . :   If the reason code is 1, a client request was made to cancel SQL processing.  For all other reason codes, see previous messages to determine why SQL processing was ended.

SQLState:  57014
ErrorCode: -952

ソリューション

最後に、STRSQL を使用できない場合、別の解決策として iSeries ナビゲーターを使用する方法があります。正確には「SQL スクリプトの実行」です (通常はここにあります --> 「%Program Files%\IBM\Client Access\Shared\cwbundbs.exe」)。 」)。

ただし、最初にシステム応答パラメーターを追加する必要があります (マシンごとに 1 回のみ) 。

ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY('I')

これは「グリーン スクリーン」で行われます。これにより、CPA32B2 照会メッセージにデフォルトの応答 ('I') が設定されます。CPA32B2 は内部メッセージ ID であり、列のドロップ操作に関連付けられています。

(実際には「グリーン スクリーン」で実行する必要はありません。CHGJOB コマンドのように使用します。例:

cl: ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY('I');

)

これで、「SQL スクリプトの実行」を開始できます。最初に実行するコマンドは次のとおりです。

cl: CHGJOB INQMSGRPY(*SYSRPYL);

これにより、現在のジョブ パラメータINQMSGRPYが *SYSRPYL に変更されます。*SYSRPYL は、照会メッセージを表示する必要がある場合に、システム応答パラメーターが存在するかどうかを調べます。

これで、列を削除する変更を実行できます。


残念ながら、JDBC を使用するだけで、列を削除する方法がわかりません。誰かが知っているなら、私に知らせてください。

参考文献:

于 2011-01-12T14:45:27.427 に答える
0

jdbc を機能させる唯一の方法は、最初にこのメッセージのデフォルトを手動で変更することです。次に、更新アプリケーションを実行します。私たちの場合、Liquibase を使用します。Java の CommandCall で ADDRPYLE と CHGJOB INQMSGRPY(*SYSRPYL) を呼び出すことができましたが、実際には、alter table * drop column * で次のエラーが発生しないようにすることはできませんでした。

エラー:

10 -- A cancel reply to an inquiry message was received.

作業コマンド:

CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')

参照:

于 2012-10-22T20:38:00.933 に答える
0

この投稿によると: http://bytes.com/topic/db2/answers/185467-drop-column-table

グリーン スクリーン環境では、STRSQL を使用して列を削除できます。私はこれにアクセスして動作しますが、400 を持つクライアントには STRSQL を使用するためのライセンス プログラムがありません。問題は、これが本当にやりたいことであるかどうかを STRSQL が確認することです。

データを取得するために、JT400 JDBC ドライバーで SQuirrel SQL クライアントを使用しています...システムがプロンプトを表示することを主張していると思います (実際には、STRSQL がなくてもプロンプトを取得する方法はありません)。 .

新しいテーブルを作成し、データをコピーしてから、テーブルを交換しています。

于 2010-12-21T23:55:36.297 に答える
0

エラー メッセージには確かに十分な情報がありませんが、主キー列を削除することは一般的に非常に危険であり、データベースが正しくそれを困難にしています。

その列に関連する外部キー制約がある可能性があります。

自分が何をしているのかよくわかっていない限り、制約をドロップしてその列を削除しないでください。

于 2010-12-21T22:47:26.170 に答える