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;

解决方案 »

  1.   

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

  2.   

    -- 例如:
    11:03:00 SCOTT@myora > delete from emp t where t.ename=ename;已删除14行。
      

  3.   

    字段和变量不要用同样的名字,可以在字段名前加个前缀表示变量,例如:var_v_busi_date