2017-07-28 51 views
0

テーブルを返すパイプライン関数を作成しようとしていますが、正しい構文が得られないようです。私はいくつかの例に従っており、一貫性のないデータ型を取得していますが、理由を理解できません。私はそれがどこかで行が行の定義が一致しない方法で返されていると仮定します。どんな助けでも大歓迎です。前もって感謝します。すべての値が正しいデータ型を持っているかどうかを確認するためにパイプライン関数return table "inconsistent datatypes:%sには%sがあります"

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); 

を挿入し、デバッグするために

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)  
); 

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')) 

答えて

1

たぶん、これを試してみてください。 DATEデータ型ではなく、VARCHAR2、すなわち

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; 

か、VARCHAR2を主張しなければならない場合のように、設定された入力値

より良い、あなたはまた、

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); 
を試してみてください
関連する問題