请各位兄台帮个忙,小弟接触ORACLE不知,现在急用2个存储过程
存储过程1:根据用户ID把此用户的所有信息删除,每1000条就commit一次.返回成功是否的标致;存储过程2:通过外部传入一个大字符串,然后利后果oracle的函数分解,插入到数据库中,也是要1000
条commit一次.也是要求返回成功是否的标致(最好能在这里面判断有则更新,没有就插入的功能呢)
谢谢各位兄弟了!
分不够会再加!

解决方案 »

  1.   

    第一个问题参考下面的过程,基本跟你的需求一样:CREATE OR REPLACE PROCEDURE bulkdelete AS  TYPE T_DATE_t IS TABLE OF TAB1.T_DATE%TYPE;  T_DATE_array T_DATE_t;  CURSOR c1 IS
        SELECT T_DATE FROM tab1 WHERE extract(MONTH FROM T_DATE) = 10;BEGIN
      OPEN c1;
      LOOP
        FETCH c1 BULK COLLECT INTO T_DATE_array LIMIT 1000; --一次删除1000条
        FORALL i IN T_DATE_array.FIRST .. T_DATE_array.LAST
          DELETE FROM tab1 WHERE T_DATE = T_DATE_array(i);
          
        EXIT WHEN c1%NOTFOUND;
      END LOOP;  CLOSE c1;  COMMIT;EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
    END bulkdelete;第二个问题看的不是很明白,分批量插入则跟上面方法类似,如果判断有则更新,没有就插入的功能,可以用merge into语句
      

  2.   

    楼上的是每次删除1000条,不是每删1000条就commit一次,应该把commit语句放在loop中
      

  3.   

    回楼上的,每删1000条就commit一次也可以,不过从事物的角度看,这么做是不对的,比如说楼主要返回一个删除成功与否的标记,你在删除前1000条的时候成功commit了,而在1001条的时候出错了,这时候要返回成功标记还是失败标记呢,前面删除的1000的已经提交了,不能再回滚了。我那么做也是分批删除,不会出现上面所说的情况,关键是forall和bulk的用法,可以去查查相关资料http://asktom.oracle.com/pls/ask/f?p=4950:8:348183202504795159::NO::F4950_P8_DISPLAYID,F4950_P8_B:5918938803188,Y
      

  4.   

    oracle中可以分解字符串的吗?
    如下:
    A1,B1,C1,D1#A2,B2,C2,D2#A3,B3,C3,D3分解后与组合:
    insert into table1(f1,f2,f3,f4)values(A1,B1,C1,D1)
    insert into table1(f1,f2,f3,f4)values(A2,B2,C2,D2)
    insert into table1(f1,f2,f3,f4)values(A3,B3,C3,D3)谢谢各位帮忙了!!
    就是利用#这个来做分解吧!!