SET SERVEROUTPUT ON;
DECLARE
  v_Id INT:=9;
  v_Name NVARCHAR2(20):='maomao';
BEGIN
 --先更新已存在的记录
 UPDATE scott.student SET NAME=v_Name WHERE ID=v_Id;
 COMMIT;
 DBMS_OUTPUT.PUT_LINE('student更新成功');   
 --判断如果未更新数据
   IF SQL%NOTFOUND THEN
     --则向员工表中插入员工记录
     INSERT INTO scott.student VALUES(v_Id,v_Name);
 COMMIT;  
     DBMS_OUTPUT.PUT_LINE('员工插入成功');             
   END IF;  
   --错误处理
   EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('插入员工表错误');  
END;   为什么我更新一条原来有的记录,还会执行员工信息的插入操作呢?SQL%NOTFOUND这句话也不是很理解?小弟刚开始了解Oracle,希望各位大神多多指教。oraclesqlinsert

解决方案 »

  1.   

    SET SERVEROUTPUT ON;
    DECLARE
      v_Id INT:=9;
      v_Name NVARCHAR2(20):='maomao';
    BEGIN
         --先更新已存在的记录
         UPDATE scott.student SET NAME=v_Name WHERE ID=v_Id;
         DBMS_OUTPUT.PUT_LINE('student更新成功');       
         --判断如果未更新数据
       IF SQL%NOTFOUND THEN
         --则向员工表中插入员工记录
         INSERT INTO scott.student VALUES(v_Id,v_Name);
         COMMIT;     
         DBMS_OUTPUT.PUT_LINE('员工插入成功');             
       END IF;  
       COMMIT;
       --错误处理
       EXCEPTION
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('插入员工表错误');
          ROLLBACK;  
    END;SQL%NOTFOUND要紧跟着你的update语句。   
      

  2.   

    在执行一个SQL语句时,oracle都会创建一个隐性游标SQL。
    SQL%NOTFOUND中的%NOTFOUND是游标的属性,表示最最近执行的sql语句没有影响任何一条数据。你把更新学生表后的commit去除,就不会执行员工信息的插入了