2017-07-28 1 views
0

J'essaie de créer une fonction de pipeline pour renvoyer une table et je n'arrive pas à obtenir la syntaxe correcte. J'ai suivi quelques exemples et je reçois des types de données incohérents et je ne comprends pas pourquoi. Je suppose que dans un sens, la ligne est retournée de manière à ne pas correspondre à la définition de ligne. Toute aide serait très appréciée. Merci d'avance.table de retour de la fonction pipeline "types de données incohérents:% s attendus% s"

DROP TYPE ODSMaxVRSN_TBL; 
DROP TYPE ODSMaxVRSN_ROW; 


CREATE OR REPLACE TYPE ODSMAXVRSN_ROW AS OBJECT 
(
    audit_sls_trans_key  Number 
,sls_tran_key     NUMBER 
,sls_4_part_key   varchar2(50), 
sls_audit_rvsn_nbr  NUMBER, 
sls_tran_key_unaud  NUMBER 
) 
/

CREATE OR REPLACE TYPE ODSMaxVRSN_TBL AS TABLE OF ODSMaxVRSN_ROW 
/

create or replace FUNCTION GET_ODSMAXVRSN (in_dtFmt varchar2,in_start_date varchar2,in_end_date varchar2) 
     RETURN ODSMAXVRSN_TBL PIPELINED IS 

l_row ODSMAXVRSN_ROW; 
l_cursor SYS_REFCURSOR; 
l_sql VARCHAR2(2000); 

begin 

    l_sql := 'With 
sales as (
select s.SLS_TRANS_KEY,s.SLS_4_PART_KEY, nvl(s.SLS_AUDIT_RVSN_NBR,0) sLS_AUDIT_RVSN_NBR, a.AUDIT_SLS_TRANS_KEY 
from SLS_TRANS s 
left outer join AUDIT_SLS_TRaNs a 
     on s.SLS_4_PART_KEY = a.SLS_4_PART_KEY and a.SLS_AUDIT_RVSN_NBR = 1 
    where s.REC_CRT_TS between to_date('''|| in_start_date ||''','''||in_dtFmt ||''') and to_date('''||in_end_date ||''','''||in_dtFmt||''')' ||' 
    and a.AUDIT_SLS_TRANS_KEY > 0 
     OR s.SLS_AUDIT_RVSN_NBR > 0 
) 
, maxrvsn as (
Select trn.SLS_4_PART_KEY 
    , to_number(max(SLS_AUDIT_RVSN_NBR)) SLS_AUDIT_RVSN_NBR 
    from sales trn 
    group by trn.sls_4_part_key 
) 
, unaudited as (
select t.SLS_TRANS_KEY, t.SLS_4_PART_KEY, t.SLS_AUDIT_RVSN_NBR 
from SLS_TRANS t 
where t.SLS_AUDIT_RVSN_NBR is null 
) 
select t.AUDIT_SLS_TRANS_KEY 
,t.SLS_TRANS_KEY 
,t.SLS_4_PART_KEY 
,t.SLS_AUDIT_RVSN_NBR 
,u.sls_trans_key 
from sales t 
inner join maxrvsn m on m.SLS_4_PART_KEY = t.SLS_4_PART_KEY and m.SLS_AUDIT_RVSN_NBR = t.SLS_AUDIT_RVSN_NBR 
left outer join unaudited u on t.SLS_4_PART_KEY = u.SLS_4_PART_KEY'; 
SYS.DBMS_OUTPUT.PUT_LINE(l_sql); 
    OPEN l_cursor FOR l_sql; 
    loop 
     fetch l_cursor into l_row; 
     exit when l_cursor%NOTFOUND; 

     pipe row (l_row); 

    end loop; 
    CLOSE l_cursor; 
    return; 
end GET_ODSMaxVRSN; 

select * from table(GET_ODSMAXVRSN('yyyy-mm-dd','2017-07-25','2017-07-31')) 

Répondre

1

Peut-être essayer celui-ci:

pipe row (ODSMAXVRSN_ROW(
    l_row.AUDIT_SLS_TRANS_KEY, 
    l_row.SLS_TRANS_KEY, 
    l_row.SLS_4_PART_KEY, 
    l_row.SLS_AUDIT_RVSN_NBR, 
    l_row.sls_trans_key)  
); 

Pour le débogage insert

SYS.DBMS_OUTPUT.PUT_LINE( 
    l_row.AUDIT_SLS_TRANS_KEY ||','|| 
    l_row.SLS_TRANS_KEY||','|| 
    l_row.SLS_4_PART_KEY||','|| 
    l_row.SLS_AUDIT_RVSN_NBR||','|| 
    l_row.sls_trans_key); 

Afin de voir si toutes les valeurs sont de type de données correct.

valeurs d'entrée ensemble mieux que DATE type de données, non VARCHAR2, à savoir

create or replace FUNCTION GET_ODSMAXVRSN (
    in_start_date DATE,in_end_date DATE) 
    RETURN ODSMAXVRSN_TBL PIPELINED IS 

... 

    where s.REC_CRT_TS between :in_start_date and :in_end_date 

... 

OPEN l_cursor FOR l_sql USING in_start_date, in_end_date; 

ou si vous devez insister sur VARCHAR2, vous essayez aussi

create or replace FUNCTION GET_ODSMAXVRSN (
    in_dtFmt varchar2,in_start_date varchar2,in_end_date varchar2) 
    RETURN ODSMAXVRSN_TBL PIPELINED IS 

... 

    where s.REC_CRT_TS between :in_start_date and :in_end_date 

... 

OPEN l_cursor FOR l_sql USING 
    TO_DATE(in_start_date, in_dtFmt), 
    TO_DATE(in_end_date, in_dtFmt);