现有的DB2列被报告为不是表的列

3
在运行DB2的Moodle 2安装中,删除用户失败,返回一个“从数据库读取错误”的错误信息:

调试信息:[IBM] [CLI Driver] [DB2/LINUXX8664] SQL0206N“USERIDFROM”在使用它的上下文中无效。SQLSTATE = 42703 SQLCODE = -206 SELECT * FROM mdl_message WHERE useridfrom =?ORDER BY timecreated
[array(    0 =>'28521', )]

SQL0206N的错误描述很明显,但是useridfrommdl_message的一列。
$ db2 describe table mdl_message

                          Data type                     Column
Column name               schema    Data type name      Length     Scale Nulls
------------------------- --------- ------------------- ---------- ----- ------
 ID                       SYSIBM    BIGINT                       8     0 No    
 USERIDFROM               SYSIBM    BIGINT                       8     0 No    
 USERIDTO                 SYSIBM    BIGINT                       8     0 No    
 SUBJECT                  SYSIBM    VARCHAR                    200     0 Yes   
 FULLMESSAGE              SYSIBM    VARCHAR                    200     0 Yes   
 FULLMESSAGEFORMAT        SYSIBM    SMALLINT                     2     0 Yes   
 FULLMESSAGEHTML          SYSIBM    VARCHAR                    100     0 Yes   
 SMALLMESSAGE             SYSIBM    VARCHAR                    200     0 Yes   
 NOTIFICATION             SYSIBM    SMALLINT                     2     0 Yes   
 CONTEXTURL               SYSIBM    VARCHAR                    200     0 Yes   
 CONTEXTURLNAME           SYSIBM    VARCHAR                    200     0 Yes   
 TIMECREATED              SYSIBM    BIGINT                       8     0 No    

  12 record(s) selected.

什么其他因素可能导致这个错误?

1
从您收到的错误消息来看,不清楚您使用的 WHERE 子句是什么。您是否忘记放置其中一个? - Kreg
这是一个奇怪的错误,表上有触发器或其他原因吗?或者有没有办法开启大小写敏感模式?不小心输入了 1(数字一)或 l(字母 L)之类的东西吗?除此之外,我假设 TIMECREATED 是自纪元以来以毫秒(或纳秒)为单位的计数,以UTC为基准——以解决DB2在时间戳中不存储时区信息的问题? - Clockwork-Muse
根据错误信息,看起来您将一个问号传递给了DB2的USERIDFROM,而不是一个大整数。 - Gilbert Le Blanc
即使在CLI中,一个简单的$ db2 "select * from mdl_message where USERIDFROM = 28251"也会返回SQL0206N "USERIDFROM"在使用它的上下文中无效。SQLSTATE=42703 - Marius Butuc
@X-Zero 不,我没有在表上设置任何触发器。 - Marius Butuc
显示剩余2条评论
2个回答

6

可能是列名中包含了空格。您可以使用此查询查找是否存在任何尾随空格:

db2 "select '<' || name || '>' from sysibm.syscolumns where tbname = 'MDL_MESSAGE'"

一个快速的问题,当我从“sysibm.syscolumns”检查列时,它给了我一堆列,但是当我执行“select* from t_name”时,我看不到那个列,它是上面sysibm列中显示的列的子集。你能帮我理解为什么列会有变化吗? - Kulbhushan Singh

0
你确定你从命令行和CLI连接的是同一个用户吗?可能存在这样一种情况,即同一张表存在于不同的模式中,你看到的是不同表的描述,但实际上访问的是另一个表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接