暂无图片
分享
周伟
2022-08-22
关于select for update 和 update 语句的潜在区别

各位专家,

小弟今天碰到一个奇葩的问题。

我们有一个生产系统,在前端通过web提交的表达保存到数据库的时候,没有出现任何异常,然后来了个需求,需要在数据库对这个提交的内容进行修改,实际上修改的内容很简单,就是把一个“2021”修改成“2022”. 我是通过pl/sql 通过select for update的方式进行,奇葩的问题就来了,无论我怎么弄,它始终报如下的错误:



我一直搞不懂这个ORA-01480 到底是个啥东西,网上有说什么半个引号的,什么乱七八糟的,我也懒得说了。说说奇葩的事情,出现问题的这个字段是 varchar2(4000) 类型的。我一开始怀疑是字段内容的长度是否超过了4000个,但问题是,我只是修改了一个2021到2022,没添加没减少的,怎么提交就报这个呢,而且这个错误他也不是字符长度超过范围的那个代码呀?

然后我采用Update语句的方式直接进行更新,结果就成功更新进数据库了。

我的疑惑就是:

1. 对于这种varchar2(4000) 的字段,前端网页在提交的时候,很明显超过了4000个字符,他是怎么提交成功的(我把内容弄到notepad++后,发现length确实超过了4000,然后我通过select for update,直接删掉一大段儿的内容,确实也能提交成功). 

2. 为什么update语句,就可以直接提交成功,他都不检查内容是否有超过范围么?

3. select for update 难道和直接 update 方式,存在什么隐藏的秘密?


望各位大哥解惑!感激不尽!oracle 数据库,11204, 客户端是PL/SQL 8

收藏
分享
2条回答
默认
最新
二两烧麦

能把语句贴出来看一下吗?

暂无图片 评论
暂无图片 有用 0
周伟
题主
2022-08-24
语句没啥特别的,就是PL/SQL里面,select * from table where xxx for update,然后手工编辑字段内容,提交就报错,然后用 update table set xxx=xxxx where xxx 就正常更新。问题是更新的字段是varchar2(4000), 字段的原始内容长度也确实超了4000字节,但一开始他是怎么insert成功的,update的时候,为什么两种方式有不同的结果。。。
周伟
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏