Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

बल्क कलेक्ट और फॉरल के साथ पीएल/एसक्यूएल को संकलित करने में सक्षम नहीं है

जब आप FORALL . का उपयोग कर रहे हों तो आप अलग-अलग फ़ील्ड का संदर्भ नहीं दे सकते* - इसलिए आपको PLS-00436 त्रुटि मिलती है।

इससे बचने के लिए, आपको अलग-अलग क्षेत्रों को संदर्भित करने के लिए सहयोगी सरणियों का उपयोग करना होगा।

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; 

*ध्यान दें कि यह सीमा अब Oracle 11g+ में मौजूद नहीं है

इसके अलावा, @jonearles के रूप में टिप्पणियां , आप केवल एक एकल SQL कथन का उपयोग कर सकते हैं....

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. ओरेकल में फोर्स आइडेंटिफ़ायर केस सेंसिटिविटी

  2. मेरी क्वेरी में समूह के भीतर एक पंक्ति संख्या कैसे जोड़ें

  3. Oracle डेटाबेस में जुड़े हुए उपयोगकर्ताओं को छोड़ना

  4. SUBSTR और INSTR SQL Oracle

  5. Oracle के लिए NLS_LANG चुनना