2016-11-09 2 views
4

Ich brauche returning_tbl(), aus dem folgenden Code innerhalb einer WITH-Klausel und übergeben Sie dann die Inline-Tabelle mit der WITH-Klausel als Parameter für eine Funktion erstellt. Wie in using_tbl_v2 (nicht zu diesem Zeitpunkt arbeiten)Wie wird die Inline-Tabelle als Parameter an die Funktion gesendet, die eine Tabelle empfängt?

using_tbl_v1 ist nur ein Beispiel für die Dinge, die funktionieren (aber sie sind einfach für mich).

Und ich erkannte, dass, sobald ich eine Inline-Tabelle erstellen, ich PLSQL-Modus beenden und SQL-Modus wechseln. Aber wie gehe ich zurück in PLSQL Modus original_tbl-receiving_tbl (...)

create or replace type SOME_OBJ force as object (
    SOME_VARCHAR varchar2(20 byte) 
); 

create or replace type SOME_TBL is table of SOME_OBJ; 


create or replace function returning_tbl 
    return SOME_TBL pipelined is 

begin 
    for current_row in (
    select 
     'SOME_VALUE' as SOME_VARCHAR 
    from dual 
) 
    loop 
    pipe row (
     SOME_OBJ(
     current_row.SOME_VARCHAR 
    ) 
    ); 
    end loop; 
    return; 
END returning_tbl; 

select * from table(returning_tbl()); 


create or replace function receiving_tbl(tbl SOME_TBL) 
    return SOME_TBL pipelined is 

begin 
    for current_row in (
    with filtered_tbl as (
     select 
     SOME_VARCHAR 
     from table(tbl) 
     where SOME_VARCHAR = 'SOME_VALUE' 
    ) 
    select * from filtered_tbl 
) 
    loop 
    pipe row (
     SOME_OBJ(
     current_row.SOME_VARCHAR 
    ) 
    ); 
    end loop; 
    return; 
END receiving_tbl; 


select * from table(receiving_tbl(returning_tbl())); 


create or replace function using_tbl_v1 
    return SOME_TBL pipelined is 

begin 
    for current_row in (
    with original_tbl as (
     select 
     SOME_VARCHAR 
     from table(returning_tbl()) 
     where SOME_VARCHAR = 'SOME_VALUE' 
    ), 
    outside_inlined_tbl as (--just as example 
     select * from table(receiving_tbl(returning_tbl())) 
    ) 
    select * from outside_inlined_tbl 
) 
    loop 
    pipe row (
     SOME_OBJ(
     current_row.SOME_VARCHAR 
    ) 
    ); 
    end loop; 
    return; 
END using_tbl_v1; 


select * from table(using_tbl_v1()); 


create or replace function using_tbl_v2 
    return SOME_TBL pipelined is 

begin 

    for current_row in (
    with original_tbl as (
     select 
     SOME_VARCHAR 
     from table(returning_tbl()) 
     where SOME_VARCHAR = 'SOME_VALUE' 
    ), 
    outside_tbl as (
     select * from table(receiving_tbl(original_tbl)) 
    ) 
    select * from outside_tbl 
) 
    loop 
    pipe row (
     SOME_OBJ(
     current_row.SOME_VARCHAR 
    ) 
    ); 
    end loop; 
    return; 
END using_tbl_v2; 


select * from table(using_tbl(_v2)); 

Antwort

1

zu liefern ersetzen:

with original_tbl as (
    select 
    SOME_VARCHAR 
    from table(returning_tbl()) 
    where SOME_VARCHAR = 'SOME_VALUE' 
), 
outside_tbl as (
    select * from table(receiving_tbl(original_tbl 
)) 
) 
select * from outside_tbl 

mit:

with original_tbl as (
    select 
    SOME_VARCHAR 
    from table(returning_tbl()) 
    where SOME_VARCHAR = 'SOME_VALUE' 
), 
outside_tbl as (
    select * from table(receiving_tbl(
    (select cast(collect(SOME_OBJ(SOME_VARCHAR)) as SOME_TBL) from original_tbl) 
)) 
) 
select * from outside_tbl 

I‘ Ich möchte eine einfache Erklärung hinzufügen, was hier passiert. Aber dieses Beispiel ist so kompliziert, ich bin mir nicht sicher, ob es hier eine einfache Lektion zu lernen gibt.

Verwandte Themen