日期:2014-05-17  浏览次数:20767 次

一个奇怪的问题,求解释
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;

------解决方案--------------------
应该将 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条件引用,应该加上对象名(存储过程)前缀: