Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Không thể biên dịch PL / SQL với BULK COLLECT và FORALL

Bạn không thể * tham chiếu các trường riêng lẻ khi bạn đang sử dụng FORALL - đó là lý do tại sao bạn gặp lỗi PLS-00436.

Để giải quyết vấn đề này, bạn sẽ phải sử dụng các mảng kết hợp để tham chiếu các trường riêng lẻ.

DECLARE

    TYPE tt_rectype IS RECORD (
      referencekey tt.referencekey%TYPE,
      spid tt.spid%TYPE,
      nnsp tt.hiredate%TYPE,
      onsp tt.deptno%TYPE,
      portingtn tt.portingtn%TYPE);

    TYPE tt_aa_type
      IS TABLE OF TT_RECTYPE INDEX BY PLS_INTEGER;

    tt_aa TT_AA_TYPE;
    CURSOR cur_data IS
      SELECT *
      FROM   tt
      WHERE  ROWID IN (SELECT ROWID
                       FROM   (SELECT ROWID,
                                      Row_number () over (PARTITION BY portingtn
                                      ,
                                      nnsp
                                      , onsp,
                                      spid,
                                      Trunc(
                                              createddate
                                      , 'MI') ORDER BY portingtn) dup
                               FROM   tt)
                       WHERE  dup > 1);
BEGIN
    OPEN cur_data;

    LOOP
        FETCH cur_data BULK COLLECT INTO tt_aa LIMIT 1000;

        FORALL i IN 1..tt_aa.COUNT
          INSERT INTO soa_temp_sv_refkey_fordelete
                      (referencekey,
                       spid,
                       nnsp,
                       onsp,
                       portingtn)
          (SELECT referencekey,
                  spid,
                  nnsp,
                  onsp,
                  portingtn
           FROM   tt
           WHERE  portingtn = Tt_aa(i).portingtn
                  AND spid = Tt_aa(i).spid
                  AND nnsp = Tt_aa(i).nnsp
                  AND onsp = Tt_aa(i).onsp
                  AND svid IS NULL);

        EXIT WHEN cur_data%notfound;
    END LOOP;

    CLOSE cur_data;

    COMMIT;
END; 

* lưu ý rằng giới hạn này không còn tồn tại trong Oracle 11g +

Ngoài ra, as @ jonearles nhận xét , bạn chỉ có thể sử dụng một câu lệnh SQL duy nhất ....

INSERT INTO soa_temp_sv_refkey_fordelete
            (referencekey,
             spid,
             nnsp,
             onsp,
             portingtn)
SELECT referencekey,
       spid,
       nnsp,
       onsp,
       portingtn
FROM   tt
WHERE  ROWID IN (SELECT ROWID
                 FROM   (SELECT ROWID,
                                Row_number () over (PARTITION BY portingtn, nnsp
                                , onsp,
                                spid,
                                Trunc(
                                        createddate
                                , 'MI') ORDER BY portingtn) dup
                         FROM   tt)
                 WHERE  dup > 1); 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao OCI8 / Oracle oci_bind_array_by_name của PHP không hoạt động với tôi?

  2. Cần thực hiện một truy vấn sql đối với hai Oracle DB trong tập lệnh shell cùng một lúc và xuất dữ liệu sang các tệp csv riêng biệt

  3. Thực thi nhiều câu lệnh SQL trong java

  4. Chọn tất cả các cột từ bảng 1 và một cột từ bảng hai được nhóm theo?

  5. Truy xuất các phần tử XML từ XMLType Oracle