暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ORA-01001: 使用返回ref游标的函数时游标无效。

askTom 2017-07-26
451

问题描述

Hi Team,

I am getting these errors 
(1 - ORA-00932: inconsistent datatypes: expected - got -

 2 - ORA-01001: invalid cursor) 
 
when I am using function returning ref cursor.
Can anyone help me in this.

These are the efforts which I have taken to implement this.

1. I have created a function returning refcursor.


create or replace function "FUNC_ALLOCATION_DASHBOARD"(start_date in DATE, end_date in DATE) return SYS_REFCURSOR
IS
l_ret_rc SYS_REFCURSOR;
ss_interval number;
dayInterval number; 
ss_qry varchar2(20000); 
ss_qry_main varchar2(1000);
ss_qry_from varchar2(1000); 
ss_qry_where varchar2(1000);
ss_qry_groupBy varchar2(1000); 
ss_qry_build_alloc varchar2(20000); 
--ss_allocation_d varchar2(20000);
ss_dt date;
end_dt date;
v_startdate date;
total_days number;
cntr number;
BEGIN
 ss_qry_main := 'select ae.supervisorid,(select m.fname||'' ''||m.lname from resource m where m.srid = ae.supervisorid) "Manager",level,ae.srid,ae.fname||'' ''||ae.lname "Resource"';
 ss_qry_from := ' from detailstable ad, resource ae ';
 ss_qry_where := ' Where ae.ENDDATE IS NULL and ae.srid = ad.employeeid(+) start with ae.srid = (select aceemp.srid from resource aceemp where aceemp.fname||'' ''||aceemp.lname = ''Justin Todd'') connect by prior ae.srid = ae.supervisorid';
 ss_qry_groupBy := ' group by ae.supervisorid,level,ae.srid,ae.fname,ae.lname order by level';    
 cntr := 1;
 v_startdate := start_date;
 total_days := round((end_date - start_date)/7,0);
 for cntr in 1..total_days loop 
        --end_dt := ss_dt + 6;
        ss_qry_build_alloc := ss_qry_build_alloc ||', COALESCE(sum(case when ad.startdate <= '|| to_date(to_char(start_date, 'dd-mon-yyyy'),'dd-mon-yyyy') ||' and ad.enddate >= '|| to_date(to_char(end_date, 'dd-mon-yyyy'),'dd-mon-yyyy') ||'then round(ad.weeklyallocpercent*100,0) end),0) '||' "Wk-'|| to_char(to_date(v_startdate, 'MM/DD/YYYY'),'WW') ||'"';
        v_startdate := v_startdate + 6;
        end loop;
     ss_qry := ss_qry_main||ss_qry_build_alloc||ss_qry_from||ss_qry_where||ss_qry_groupBy;
    --return ss_qry;
    OPEN l_ret_rc FOR ss_qry; 
    return l_ret_rc;
   exception
       when others then
       dbms_output.put_line(sqlerrm);
       return null;
end FUNC_ALLOCATION_DASHBOARD;

2. Created table of object type.

CREATE OR REPLACE TYPE  "ALLOCATION_TYPE" as OBJECT
(
  supervisorid number
  , mgr varchar2(100)
  , hlevel number
  , srid number
  , employee varchar2(100)
  , week1 number
  , week2 number
  , week3 number
  , week4 number
  , week5 number
  , week6 number
  , week7 number
  , week8 number
  , week9 number
  , week10 number
  , week11 number
  , week12 number
  , week13 number
  , week14 number
  , week15 number
  , week16 number
  , week17 number
  , week18 number
  , week19 number
  , week20 number
  , week21 number
  , week22 number
  , week23 number
  , week24 number
  , week25 number
  , week26 number
  , week27 number
  , week28 number
  , week29 number
  , week30 number
  , week31 number
  , week32 number
  , week33 number
  , week34 number
  , week35 number
  , week36 number
  , week37 number
  , week38 number
  , week39 number
  , week40 number
  , week41 number
  , week42 number
  , week43 number
  , week44 number
  , week45 number
  , week46 number
  , week47 number
  , week48 number
  , week49 number
  , week50 number
  , week51 number
  , week52 number
  , week53 number
)
/

3. CREATE OR REPLACE TYPE  "ALLOCATION_TAB_TYPE" IS TABLE OF allocation_type
/

4. Created a pipelined function

create or replace FUNCTION allocation_dashboard_pipe_fn( i_cursor SYS_REFCURSOR)
    RETURN allocation_tab_type PIPELINED IS
    l_row allocation_type := allocation_type(NULL, NULL, NULL, NULL, NULL, NULL, NULL,null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
BEGIN
    LOOP
        FETCH i_cursor INTO l_row.supervisorid, l_row.mgr, l_row.hlevel, l_row.srid, l_row.employee, l_row.week1, l_row.week2, l_row.week3, l_row.week4, l_row.week5,l_row.week6, l_row.week7, l_row.week8, l_row.week9, l_row.week10, l_row.week11, l_row.week12, l_row.week13, l_row.week14, l_row.week15, l_row.week16, l_row.week17, l_row.week18, l_row.week19, l_row.week20, l_row.week21, l_row.week22, l_row.week23, l_row.week24, l_row.week25, l_row.week26, l_row.week27, l_row.week28, l_row.week29, l_row.week29, l_row.week30, l_row.week31, l_row.week32, l_row.week33, l_row.week34, l_row.week35, l_row.week36, l_row.week37, l_row.week38, l_row.week39, l_row.week40, l_row.week41, l_row.week42, l_row.week43,
l_row.week44, l_row.week45, l_row.week46, l_row.week47, l_row.week48, l_row.week49, l_row.week50, l_row.week51, l_row.week52, l_row.week53;
        EXIT WHEN i_cursor%NOTFOUND;
        PIPE ROW( l_row);
    END LOOP;
    CLOSE i_cursor;
    RETURN;
END;

5. Then call function in two ways 
  - SELECT * FROM TABLE(allocation_dashboard_pipe_fn(func_allocation_dashboard(to_date('01-jul-2017','dd-mon-yyyy'),to_date('31-jul-2017','dd-mon-yyyy'))));
      - Error no 2 Invalid cursor.

   
   Please help me I am not getting where I am doing wrong.

专家解答

哦,亲爱的。你有:

   exception
       when others then
       dbms_output.put_line(sqlerrm);


在函数分配仪表板中。执行此操作时 “出了点问题”。删除此异常处理程序,以更好地了解错误。然后自行调试此过程,以找出错误所在。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论