首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORA-01407:无法将("SYSADM"."PS_LM_ENRLMT"."LM_ACT_ID")更新为NULL

ORA-01407:无法将("SYSADM"."PS_LM_ENRLMT"."LM_ACT_ID")更新为NULL
EN

Stack Overflow用户
提问于 2015-04-01 01:58:17
回答 1查看 413关注 0票数 0

大家好,

当我试图运行下面的查询时,我得到了这个错误。

代码语言:javascript
运行
复制
Update PS_LM_ENRLMT A
Set A.LM_ACT_ID = (Select B.LM_ACT_ID FROM PS_LM_ACT B                                                                                 
               where B.LM_ACT_ID = A.LM_ACT_ID                     
               And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'        
               AND A.LM_ACT_ID = 1166            
               And A.LM_CI_ID!= 1196)

为了避免Null错误,我更新了查询,如下所示:

代码语言:javascript
运行
复制
Update PS_LM_ENRLMT A                                

Set A.LM_ACT_ID = (Select B.LM_ACT_ID FROM PS_LM_ACT B       
               where B.LM_ACT_ID = A.LM_ACT_ID        
               And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'          
               AND A.LM_ACT_ID = 1166           
               And A.LM_CI_ID!= 1196)           
where exists      
(Select B.LM_ACT_ID FROM PS_LM_ACT B                              
               where B.LM_ACT_ID = A.LM_ACT_ID         
               And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'          
               AND A.LM_ACT_ID = 1166          
               And A.LM_CI_ID!= 1196)

查询成功运行,但没有更新任何数据。我找不到原因。有谁能帮帮忙。

谢谢,AJ

EN

回答 1

Stack Overflow用户

发布于 2015-04-01 09:21:12

听起来好像主表中没有行是子查询返回结果的。因此,第一条语句试图将所有行更新为NULL,这可能违反了表上的约束;第二条语句没有更新任何行,因为EXISTS条件过滤掉了所有行。

基本上,您需要查看数据和查询,并找出原因。但是,在您的查询中有一个明显的潜在问题:

代码语言:javascript
运行
复制
And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'

这看起来像是将日期或时间戳列与字符串进行比较,这意味着为了进行比较,将使用会话的NLS_DATE_FORMAT将列值隐式地转换为字符串。如果NLS_DATE_FORMAT与您用于字符串的格式不匹配,结果将非常不可预测。在这种情况下,即使使用的格式是您所期望的,我也怀疑结果是否是您想要的,因为以该格式比较字符串将不会产生与比较等价日期相同的结果。(例如,"08-DEC-14“在词法上小于"09-DEC-13”,但它代表的日期几乎晚于一年。

最好使用日期或时间戳文字,这样就不会发生类型转换:

代码语言:javascript
运行
复制
And B.LM_ROW_ADDED_DTTM < TIMESTAMP '2013-13-09 17:35:35.000'

(如果该列实际上是所需格式的字符串,那么字符串的比较与等效日期值的比较仍然是不同的。)

编辑过的添加了,看起来更近了一点,更新一点意义都没有。子查询需要该B.LM_ACT_ID = A.LM_ACT_ID,然后如果找到行,则将A.LM_ACT_ID更新为B.LM_ACT_ID中的值-根据定义,这是相同的值。因此,如果这样做确实更新了任何行,则只需将它们设置为与它们已有的值相同。看起来你需要重新评估你正在尝试做的是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29375315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档