去掉returning后,则可影响ename为'JONES'的所有行。UPDATE emp
  SET job ='MANAGER', sal = sal + 1000, deptno = 20
  WHERE ename = 'JONES';

解决方案 »

  1.   

    我试了一下,好象不能定义动态数组,不过你可以看看下面这个例子:DECLARE
       TYPE Emplist IS VARRAY(100) OF NUMBER;
       Empids EMPLIST := EMPLIST(7369, 7499, 7521, 7566, 7654, 7698);
       TYPE Bonlist IS TABLE OF Emp_tab.sal%TYPE;
       Bonlist_inst BONLIST;
    BEGIN
       Bonlist_inst := BONLIST(1,2,3,4,5);
       FOR i IN Empids.FIRST..Empids.LAST LOOP
          UPDATE Emp_tab Set Bonus = 0.1 * sal        
             WHERE Empno = Empids(i)
           RETURNING Sal INTO BONLIST(i);
       END LOOP;
    END;如果有什么更好的办法别忘了贴出来大家共享哦
      

  2.   

    FOR i IN 1..Empids.count LOOP
    曾看过关于此例子,回去查找资料
      

  3.   

    目前最好的办法还是 ColinGan(浪子)的,看来是没有别的办法了。不过ORACLE文档中明明写着可以处理影响多行的UPDATE语句,只是没有给出例子,能不能该推荐一个国外的论坛去问问?
      

  4.   

    9i的写法:
    DECLARE
       TYPE emp_rec_rt IS RECORD (
          v_ename   VARCHAR2(10),
          v_sal     number(7,2),
          v_deptno  number(2));   TYPE emp_tab_t IS TABLE OF emp_rec_rt INDEX BY BINARY_INTEGER;   v_emprows emp_tab_t;BEGIN
          UPDATE emp
             SET sal = sal + 1000
           WHERE deptno = 20
       RETURNING ename,sal * 0.25, deptno
            BULK COLLECT INTO v_emprows;   FOR i IN 1 .. v_emprows.LAST LOOP      Dbms_Output.Put_Line(v_emprows(i).v_ename||','||
                               v_emprows(i).v_sal||','||
                               v_emprows(i).v_deptno);
       END LOOP;
    END;
    /