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 :
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:
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 :
CREATE PROCEDURE TEST_FUNCTION (
VAL INTEGER)
RETURNS (
VAL_ADDED INTEGER)
AS
begin
/* Procedure Text */
val_added = val + 1;
suspend;
end