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 和 Reason code 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 Navigator,确切地说是它的“运行 SQL 脚本”(通常在这里 --> "%Program Files%\IBM\Client Access\Shared\cwbundbs.exe ”)。

但首先你必须添加一个系统回复参数(每台机器只有一次

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 导致在应显示查询消息时查看是否存在系统回复参数。

现在您可以运行您的 alter 删除列。


不幸的是,我不知道如何删除一列,只使用 JDBC。如果有人知道,请告诉我。

参考:

于 2011-01-12T14:45:27.427 回答
7

最后我找到了解决方案:

CALL QSYS2.QCMDEXC('ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY(''I'')');
CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)');


ALTER TABLE <tablename> DROP COLUMN <column_name>;                
于 2017-05-18T15:40:28.137 回答
0

您的错误消息中没有足够的信息可以确定,但是删除主键列通常是非常危险的,并且数据库正确使得它变得困难。

您可能有一个涉及该列的外键约束。

除非您确定自己知道自己在做什么,否则不要删除约束并删除该列。

于 2010-12-21T22:47:26.170 回答
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

我发现让 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

绿屏——STRSQL会给你错误信息来回答

更改表 devlibsc/trklst 删除列“ST”

更改文件 TRKLST 可能会导致数据丢失。(CI)

于 2015-11-18T18:15:41.017 回答