一个奇怪的问题,求解释

搞怪的索引 2013-06-17 10:47:11
SELECT * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
"CORE 10.2.0.4.0 Production"
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

在存储过程中定义一个日期型变量 v_busi_date ,赋值2013-06-16 ;
根据该变量删除表 tb_employee_class 中相应业务日期的记录,其中表中业务日期字段名称与日期型变量的名称一样也是 v_busi_date ,当发出下列语句时,表中所有业务日期的数据全部删掉了,为什么?
delete tb_employee_class t where t.v_busi_date=v_busi_date;
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2013-06-17
  • 打赏
  • 举报
回复
-- 例如: 11:03:00 SCOTT@myora > delete from emp t where t.ename=ename; 已删除14行。
luoyoumou 2013-06-17
  • 打赏
  • 举报
回复
应该将 t.v_busi_date=v_busi_date
修改成: t.v_busi_date=pro_name.v_busi_date

-- 其中:pro_name 替换成你的“存储过程名”
因为t.v_busi_date=v_busi_date中,Oracle在默认情况下是先检查你的表是不是有v_busi_date字段名,
如果有(你这个时候有),就选择它,如果没有,就看你是不是定义了一个名为v_busi_date的变量(或常量)。

-- 所以,为了避免类似Bug,你的所有涉及到变量的where条件引用,应该加上对象名(存储过程)前缀:
宋哥 2013-06-17
  • 打赏
  • 举报
回复
字段和变量不要用同样的名字,可以在字段名前加个前缀表示变量,例如:var_v_busi_date

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧