博主一个删除download记录的小function,注意其中bulk collect into跟forall的利用.

   PROCEDURE delete_route_download_bol (device_id_in    VARCHAR2,
                                        bol_id_in       INTEGER)
   AS
      TYPE t_rowids
      IS
         TABLE OF ROWID
            INDEX BY PLS_INTEGER;

      v_rowids       t_rowids;

      TYPE t_routedownload IS TABLE OF tms.tms_route_download%ROWTYPE;

      download_rec   t_routedownload:=new t_routedownload(null,null,null,null,null,null);
   BEGIN
      SELECT   ROWID
        BULK   COLLECT
        INTO   v_rowids

        FROM   (  SELECT   ROWID
                    FROM   tms.tms_route_download trd
                   WHERE   UPPER (device_id_in) LIKE 'DEV%'
                           AND device_id = device_id_in
                           AND EXISTS
                                 (SELECT   1
                                    FROM   tms_route_header rh
                                   WHERE   rh.truck_route_instance_id =
                                              trd.truck_route_instance_id
                                           AND rh.bill_of_lading_id = bol_id_in)
                 );

      FORALL i IN 1 .. v_rowids.COUNT
               DELETE FROM   tms.tms_route_download
                     WHERE   ROWID = v_rowids (i)
                 RETURNING   truck_route_instance_id,
                             device_id,
                             download_date,
                             bill_of_lading_id,
                             driver_name,
                             confirm_date
         BULK COLLECT INTO   download_rec;

      IF download_rec.COUNT > 0
      THEN
         FOR i IN 1 .. download_rec.COUNT
         LOOP
            IF download_rec (i).download_date IS NOT NULL
            THEN
               INSERT INTO tms.tms_handheld_log (device_id,
                                                 msg_dt,
                                                 severity,
                                                 category,
                                                 msg_text,
                                                 svr_dt,
                                                 log_id)
                 VALUES   (download_rec (i).device_id,
                           download_rec (i).download_date,
                           6,
                           'TESTDOWNLOAD',
                           download_rec (i).truck_route_instance_id,
                           SYSDATE,
                           tms_handheld_seq.NEXTVAL);
            END IF;
         END LOOP;
      ELSE
         DBMS_OUTPUT.put_line ('There is no history be deleted.');
         RETURN;
      END IF;

      DBMS_OUTPUT.put_line ('Data be updated successfully.');
      COMMIT;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         DBMS_OUTPUT.put_line ('No data be updated.');
   END;

魔兽就是毒瘤,大家千万不要玩。
原文地址:https://www.cnblogs.com/tracy/p/1712536.html