Firebird: inserire una procedura parametrica con ritorno di dati in una Join
Supponiamo di avere una procedura che richiede parametri e restituisce un result set di dati, per evitare di fare infinite subquery si penserebbe di poterla mettere in join tipo :
1 2 |
select a.idcontatto, t.val_added from anagrafiche a, test_function(a.idcontatto) t |
ma questo sistema non funziona dato che all’interno della from non verrebbero elaborati i dati della prima tabella e avremmo un errore non formale ma di elaborazione.
Il problema si risolve semplicemente utilizzando una left join che prevede a livello di motore database di permettere l’elaborazione del result set di dati partendo da sisnistra, quindi nel nostro caso verrebbero analizzati per primi i dati della tabella “ANAGRAFICHE”. Quindi utilizzando la sintassi dell’esempio qui sotto otterremo il risultato aspettato:
1 2 3 4 |
select a.idcontatto, t.val_added from anagrafiche a left join test_function(a.idcontatto) t on 1=1 |
quindi se avessimo altre procedure da mettere in join semplicemente basterebbe fare altri “left join” come da esempio, e potremmo utilizzare come parametri anche i valori di output di un’altra procedura.
Ovviamente potrete obiettare che la left join ritorna sempre il record set delle tabelle a monte della left, ma nessuno ci vieta di utilizzare a fine delle join un sana “WHERE” e fare i controlli che ci servono per escludere i record indesiderati.
di seguito il semplice codice della procedura uutilizzata :
1 2 3 4 5 6 7 8 9 10 |
CREATE PROCEDURE TEST_FUNCTION ( VAL INTEGER) RETURNS ( VAL_ADDED INTEGER) AS begin /* Procedure Text */ val_added = val + 1; suspend; end |