还有一个办法是用游标取得要分的记录数后输出insert语句,然后批量执行,呵呵

解决方案 »

  1.   


    SQL> create table table1 (a number,b number);Table createdSQL> insert into table1 values(11,3);1 row insertedSQL> insert into table1 values(22,-5);1 row insertedSQL> commit;Commit completeSQL> create or replace type MyType as object (
      2  f1 NUMBER,
      3  f2 NUMBER
      4  );Type createdSQL> create type MyTypeList as table of MyType;Type createdSQL> CREATE OR REPLACE FUNCTION recodeDivied RETURN MyTypeList
      2    PIPELINED AS
      3    v_MyType MyType;
      4    CURSOR c IS
      5      SELECT * FROM table1;
      6  
      7    v_a      NUMBER;
      8    v_b      NUMBER;
      9    v_b_sign NUMBER;
     10  
     11  BEGIN
     12    FOR r_c IN c
     13    LOOP
     14      v_a := r_c.a;
     15      v_b := r_c.b;
     16      v_b_sign := abs(v_b) / v_b;
     17  
     18      LOOP
     19        EXIT WHEN v_b = 0;
     20        v_MyType := MyType(v_a, v_b_sign);
     21        PIPE ROW(v_MyType);
     22        v_b := v_b - v_b_sign;
     23      END LOOP;
     24    END LOOP;
     25    RETURN;
     26  END recodeDivied;
     27  /Function createdSQL> select * from table(recodeDivied);        F1         F2
    ---------- ----------
            11          1
            11          1
            11          1
            22         -1
            22         -1
            22         -1
            22         -1
            22         -18 rows selectedSQL>