2009-03-03 3 views
5

Ho una funzione oracle che ha un parametro in che è di tipo riga di una tabella, da un'istruzione select ho bisogno di passare la riga corrente a questa funzione in modo tale che esegue qualche elaborazione e restituisce un valore. Esiste una pseudo variabile che può essere utilizzata nel contesto di un'istruzione select equivalente a un trigger vecchio e nuovo.Come chiamare una funzione con parametro Rowtype da un'istruzione select in Oracle

Vorrei fare qualcosa di simile

select *,function1(rowtype) from table1 

voglio evitare di passare più parametri, quindi la domanda dovrebbe essere considerata in questo contesto.

risposta

0

Perché non basta passare l'id della riga e far funzionare la funzione?


EDIT: Potreste essere in grado di costruire un oggetto/TIPO al volo e passare che a una funzione. Quindi dovrai solo eseguire una query per i dati una sola volta. Fammi sapere se hai bisogno di un esempio.


+1

in questo caso ho bisogno di recuperare nuovamente le informazioni sulla riga –

2

Si può fare questo:

DECLARE 
    foo table1%ROWTYPE; 
BEGIN 
    function1(foo); 
END; 

EDIT: È possibile controllare this blog post per una descrizione più dettagliata di come utilizzare questa tecnica.

+1

questa deve essere una singola istruzione select, se passo attraverso PL/SQL allora ho molte opzioni –

3

Non è possibile farlo con% ROWTYPE. % ROWTYPE è in realtà un tipo di record PL/SQL, che non è un tipo legale in SQL, quindi non è possibile utilizzarlo in SELECT. È necessario creare un tipo di oggetto che ha le stesse colonne della tabella, passare alla funzione di aspettarsi che tipo di oggetto invece di% ROWTYPE, e poi si può scrivere qualcosa del genere:

SELECT function(table1_typ(column1, column2, column3)) 
    FROM table1 t1 

Svantaggi: Hai ancora a digita tutte le colonne in SELECT e se cambi la tabella, dovrai modificare anche il tipo di oggetto e SELECT.

+0

beh, in realtà stavo cercando questa opzione dato che volevo evitare passando più colonne alla stored procedure, ma se devo ancora passare tutte le colonne, penso che sia meglio passarle a SP, quindi connettere a un tipo e poi inviarlo. –