我想删除名为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
我可能错了,但我认为它与防止表丢失数据有关。为了解决这个问题,我需要创建一个没有列的新表,并将旧表中的数据复制到新表中,然后用新表替换旧表。
答案 0 :(得分:21)
AS400因为可能的数据丢失而向您发出警告(查询消息),要求您取消或忽略请求的操作。所以,由于这是一个交互式请求,通过JDBC / ODBC你不能输入'我'来忽略,而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连接,这将提供有关错误的更多信息。有关其他连接参数,请参阅this。
示例连接字符串:
JDBC:AS400://服务器;库= * LIBL;命名=系统的错误=满强>
通过该连接,产生的错误将是这样的:
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查询消息上设置了一个deafult答案('I')。 CPA32B2是一个内部按摩id,与drop column操作相关联。
(实际上不必在“绿屏”中完成,像CHGJOB命令一样使用它。例如:
cl:ADDRPYLE SEQNBR(1500)MSGID(CPA32B2)RPY('I');
)
现在您可以启动“运行SQL脚本”,第一个要运行的命令是:
cl:CHGJOB INQMSGRPY(* SYSRPYL);
这会将当前作业参数INQMSGRPY更改为* SYSRPYL。 *当应显示查询消息时,SYSRPYL会查看是否存在系统回复参数。
现在您可以运行删除列的alter。
不幸的是,我不知道如何使用JDBC来删除列。如果有人知道,请告诉我。
参考文献:
答案 1 :(得分:5)
最后我找到了解决方案:
CALL QSYS2.QCMDEXC('ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY(''I'')');
CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)');
ALTER TABLE <tablename> DROP COLUMN <column_name>;
答案 2 :(得分:0)
您的错误消息中没有足够的信息可以确定,但删除主键列通常风险很大,数据库正确地使其变得困难。
您可能有涉及该列的外键约束。
除非您确定知道自己在做什么,否则不要删除约束并删除该列。
答案 3 :(得分:0)
根据这篇文章:http://bytes.com/topic/db2/answers/185467-drop-column-table
可以在绿屏环境中使用STRSQL删除列。我可以访问它并且它确实有效,但是具有400的客户端没有使用STRSQL的许可程序。问题是STRSQL会提示我是否真的想做这件事。
要获取数据,我正在使用带有JT400 JDBC驱动程序的SQuirrel SQL客户端...所以我想系统坚持提示(实际上即使没有STRSQL也无法获得提示)它不会让我这样做。
所以我想我正在做我正在做的事情......创建一个新表并复制数据然后交换表。
答案 4 :(得分: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')
参考:
答案 5 :(得分:0)
绿色屏幕 - STRSQL会给你错误的消息来回答
alter table devlibsc / trklst drop column“ST”
更改文件TRKLST可能会导致数据丢失。 (C I)