2009-10-19 10 views
8

Ich habe eine Funktion, die ein Objekt zurückgibt, das 3 Werte hat. Gibt es eine Möglichkeit, diese Funktion aus einer SELECT-Anweisung aufzurufen und jeden Wert eine andere Spalte zu haben? Ich könnte es in 3 Funktionen brechen, aber die Werte sind verwandt, also wollte ich es aus Leistungsgründen als eins behalten. (So ​​Orakel muss nicht in der Abfrage für jede Zeile 3 sehr ähnlich komplexe Funktionen nennen.)Verwenden eines Objekttyps in einer SELECT-Anweisung in Oracle

So für:

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

Ich mag würde in der Lage sein von einer select-Anweisung zu nennen test_func , aber haben a, b und c verschiedene Spalten, ohne die Funktion mehrmals aufzurufen. Ich dachte, vielleicht so etwas wie diese, aber es funktioniert nicht:

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

Gibt es eine Möglichkeit etwas in Oracle 10g zu tun, oder gibt es einen besseren Weg, um dieses Problem zu lösen?

Antwort

9

Die Select-Anweisung in der Frage wird funktionieren. Es ist fehlgeschlagen, weil ich keinen Alias ​​für die Inline-Ansicht angegeben habe.

Aus irgendeinem Grund dies funktionieren wird:

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

aber das wird nicht:

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

danke! Das hat mir geholfen. – filiprem

+1

Das Problem ist einfach mit Namensauflösung. Oracle interpretiert den ersten Teil vor dem Punkt in der SELECT-Anweisung immer als Tabellenalias oder Synonym/Paket in der Datenbank. Es überprüft nicht auch alle Spalten. Sie müssen den Namen also vollständig mit table_alias.column.attribute qualifizieren – Falco

2

Die Tabelle alias gibt das Ergebnis in eine benannte Ergebnismenge Kontext, der das Ergebnis ermöglicht arbeiten als Objektinstanz. Ohne den Alias ​​schlägt es fehl, weil das Casting Objekttyp-Instanzen ohne ihren eigenen expliziten Verweis nicht behandelt, was effektiv der Tabellenalias ist.

Verwandte Themen