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

PL/SQL关于插入和更新的操作

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,希望各位大神多多指教。
oracle sql insert

------解决方案--------------------
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语句。   
------解决方案--------------------
在执行一个SQL语句时,oracle都会创建一个隐性游标SQL。
SQL%NOTFOUND中的%NOTFOUND是游标的属性,表示最最近执行的sql语句没有影响任何一条数据。

你把更新学生表后的commit去除,就不会执行员工信息的插入了