Home » SQL & PL/SQL » SQL & PL/SQL » implementation restriction: cannot reference fields of bulk in-bind table of records error
implementation restriction: cannot reference fields of bulk in-bind table of records error [message #624037] Wed, 17 September 2014 06:40 Go to next message
aditi5
Messages: 1
Registered: September 2014
Location: bangalore
Junior Member
Hi,

this is my code
TYPE RefCur IS REF CURSOR;
   UPD_CUR RefCur;

   TYPE t_ROWIDS IS TABLE OF UROWID INDEX BY PLS_INTEGER;
   col_ROWIDS t_ROWIDS;

   s_TableNm  VARCHAR2(200) := Upper(RTrim(p_TableNm));
   s_FSQLText  t_SQLText;
   s_USQLText  t_SQLText;   

   BEGIN
      CASE 
         -- Special Process for ACCOUNT_DIM Table
         WHEN s_TableNm = 'ACCOUNT_DIM'   
           OR s_TableNm = 'DW.ACCOUNT_DIM'            THEN
            s_TableNm  := s_TableNm || ' PARTITION(ACCT_DIM_ACTIV)';
            s_USQLText := 'UPDATE  '            || s_TableNm || ' SET RECORD_STATUS = 1 WHERE RECORD_STATUS IN (8, 9)';
            EXECUTE IMMEDIATE s_USQLText;
            COMMIT;

         -- Special Process for BBT RTL Table
         WHEN s_TableNm = 'ACCOUNT_DIM_RTL_BBT'
           OR s_TableNm = 'DWBBT.ACCOUNT_DIM_RTL_BBT' THEN
            s_TableNm  := s_TableNm || ' PARTITION(ACTDM_BBT_RTL_ACTIV)';
            s_USQLText := 'UPDATE  '            || s_TableNm || ' SET RECORD_STATUS = 1 WHERE RECORD_STATUS IN (8, 9)';
            EXECUTE IMMEDIATE s_USQLText;
            COMMIT;

         -- Special Process for BBT COM Table
         WHEN s_TableNm = 'ACCOUNT_DIM_COM_BBT'
           OR s_TableNm = 'DWBBT.ACCOUNT_DIM_COM_BBT' THEN
            s_TableNm  := s_TableNm || ' PARTITION(ACTDM_BBT_COM_ACTIV)';
            s_USQLText := 'UPDATE  '            || s_TableNm || ' SET RECORD_STATUS = 1 WHERE RECORD_STATUS IN (8, 9)';
            EXECUTE IMMEDIATE s_USQLText;
            COMMIT;

         -- Special Process for BBT CHH Table
         WHEN s_TableNm = 'CARDHOLDER_HIST_DIM'
           OR s_TableNm = 'DWBBT.CARDHOLDER_HIST_DIM' THEN
            s_TableNm := s_TableNm || ' PARTITION(CH_HIST_ACTIV)';
            s_USQLText := 'UPDATE  '            || s_TableNm || ' SET RECORD_STATUS = 1 WHERE RECORD_STATUS IN (8, 9)';
            EXECUTE IMMEDIATE s_USQLText;
            COMMIT;

         ELSE
            s_FSQLText  := 'SELECT ROWID FROM ' || p_TableNm || ' WHERE RECORD_STATUS IN (8, 9)';
            s_USQLText  := 'UPDATE  '           || p_TableNm || ' SET RECORD_STATUS = 1 WHERE ROWID = :r';   
   
            -- READS ALL STATUS 8/9
            OPEN UPD_CUR FOR s_FSQLText;
            i_RowCount := 0;
            LOOP
                FETCH UPD_CUR 
                  BULK COLLECT INTO col_ROWIDS
                  LIMIT 50000;
            
               EXIT WHEN col_ROWIDS.COUNT = 0;
               FORALL indx IN 1 .. col_ROWIDS.COUNT SAVE EXCEPTIONS
                  EXECUTE IMMEDIATE s_USQLText USING col_ROWIDS (indx);
               COMMIT;
               i_RowCount := i_RowCount + col_ROWIDS.COUNT;
               i_RowCount := i_RowCount - SQL%BULK_EXCEPTIONS.COUNT;
            END LOOP;
            COMMIT;
           CLOSE UPD_CUR;
       END CASE;

   EXCEPTION
      WHEN DUP_VAL_ON_INDEX THEN
          NULL;
      WHEN OTHERS THEN
         IF SQLCODE = -24381 THEN
            FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
            LOOP
               DBMS_OUTPUT.PUT_LINE (
                     SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX
                  || ': '
                  || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE);
            END LOOP;
         ELSE
            RAISE_APPLICATION_ERROR(-20001, 'Error in package PKG_ETL_RECSTAT_MERGE Procedure SP_UPD_RECSTAT_9to1 error_id = ' || SQLCODE || '-' || SQLERRM);
         END IF;
   END SP_UPD_RECSTAT_9to1;



when i m running it in 11g, it is running fine but i am getting error in 10g

implementation restriction: cannot reference fields of bulk in-bind table of records error. Please help. How to modify the code to avoid this error. Thanks.


Edited by Lalit : Added code tags to preserve code formatting.

[Updated on: Wed, 17 September 2014 06:42] by Moderator

Report message to a moderator

Re: implementation restriction: cannot reference fields of bulk in-bind table of records error [message #624038 is a reply to message #624037] Wed, 17 September 2014 06:41 Go to previous messageGo to next message
Lalit Kumar B
Messages: 3174
Registered: May 2013
Location: World Wide on the Web
Senior Member
Welcome to the forum!

Please read and follow the OraFAQ Forum Guide and How to use [code] tags, to enable us to help you.
Re: implementation restriction: cannot reference fields of bulk in-bind table of records error [message #624039 is a reply to message #624038] Wed, 17 September 2014 06:47 Go to previous message
Lalit Kumar B
Messages: 3174
Registered: May 2013
Location: World Wide on the Web
Senior Member
As the error suggests, in versions prior to 11g, it prevents from referencing individual attributes of records with FORALL. You can look for a workaround here. Also search AskTom site for this error, I remember Tom also provided a nice workaround for 9i and 10g versions.
Previous Topic: duplicate record
Next Topic: need database trigger
Goto Forum:
  


Current Time: Fri Apr 26 18:50:41 CDT 2024