'Oracle SQL - table type in cursor causing ORA-21700: object does not exist or is marked for delete

I have problem with my function, I'm getting ORA-21700: object does not exist or is marked for delete error. It's caused by table type parameter in cursor, but I've no idea how to fix it. I've read that table type part should be assigned to a variable, but it can't be done in cursor, right? I've marked the part which causing the issue

Can anyone help? Is there any other way I can do this?

My package looks something like this:

 FUNCTION createCSV(DateFrom  date
                    ,DateTo    date) 
    RETURN clob IS
    
    CURSOR c_id (c_DateFrom  date
                ,c_DateTo    date) IS
      SELECT id
        FROM limits
       WHERE utcDateFrom <= NVL(c_DateTo, utcDateFrom)
         AND NVL(utcDateTo, c_DateFrom + 1) >= c_DateFrom + 1; 
    
    CURSOR c (c_DateFrom  date
             ,c_DateTo    date
             ,pc_tDatePeriods test_pkg.t_date_periods) IS -- this is table type (TYPE xx AS TABLE OF records)
        SELECT l.id                                                limit_id  
              ,TO_CHAR(time_cond.utcDateFrom, og_domain.cm_yyyymmddhh24mi) time_stamp_from  
              ,TO_CHAR(time_cond.utcDateTo, og_domain.cm_yyyymmddhh24mi)   time_stamp_to             
          FROM limits l     
          JOIN (SELECT limit_id, utcDateFrom, utcDateTo FROM TABLE(pc_tDatePeriods) --This part is causing the issue
               ) time_cond
            ON l.id = time_cond.limit_id
         WHERE l.utcDateFrom <= NVL(c_DateTo, l.utcDateFrom)
           AND NVL(l.utcDateTo, c_DateFrom + 1) >= c_DateFrom + 1;
        
    CSV           clob;  
    tDatePeriods  test_pkg.t_date_periods := test_pkg.t_date_periods();
  BEGIN
    FOR r_id IN c_id(DateFrom, DateTo)
    LOOP
      tDatePeriods := test_pkg.includeTimeGaps(p_Id => r_id.id); --this loop is ok
      
      FOR r IN c(DateFrom, DateTo, tDatePeriods) --here I'm getting error
      LOOP
        CSV := CSV || chr(13) || r.limit_id || ',' || r.time_stamp_from || ',' || r.time_stamp_to;
      END LOOP;
      
    END LOOP;
    
    RETURN CSV;   
  END createCSV;  


Solution 1:[1]

Your problem should be solved by declaring type test_pkg.t_date_periods on schema level instead of in package.

Similar answer can be found here but with more details.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1