Una procedura memorizzata è un programma compilato, memorizzato su DB2 locale o su server remoto, che può eseguire istruzioni SQL. In Net.Data, le procedure memorizzate vengono chiamate dalle funzioni di Net.Data che utilizzano l'istruzione CALL SQL. I parametri delle procedure memorizzate vengono trasferiti dall'elenco dei parametri della funzione di Net.Data. E' possibile utilizzare le procedure memorizzate per migliorare le prestazioni e l'integrità mantenendo istruzioni SQL compilate con i il server di database.
Questa sezione descrive i seguenti argomenti:
La sintassi della procedura memorizzata utilizza l'istruzione FUNCTION, l'istruzione CALL e, facoltativamente, un blocco REPORT.
%function
(dtw_sql) nome_funzione ([IN datatype arg1, INOUT datatype arg2,
OUT nometabella, ...])
CALL procedura_memorizzata
[%REPORT(nomeserierisultati...)]
In cui:
Tabella 2. Tipi di dati per le procedure memorizzate
| CHAR | FLOAT | TIME |
| DATE | GRAPHIC | TIMESTAMP |
| DECIMAL | INTEGER | VARCHAR |
| DOUBLE | REAL | VARGRAPHIC |
| DOUBLEPRECISION | SMALLINT |
|
|
|
|
|
|
|
|
|
Per chiamare una procedura memorizzata:
%function (dtw_sql) nome_funzione()
%function (dtw_sql) nome_funzione (IN datatype arg1, INOUT datatype arg2, OUT nometabella...)
CALL procedura_memorizzata
%report
{
...
%}
Esempio:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1 OUT mytable) {
CALL myproc
%report {
...
%row { ... %}
...
%}
%}
%function (dtw_sql) nome_funzione (OUT nometabella, ...)
%REPORT(nomeseriedirisultati1)
{
...
%}
Esempio:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1, OUT table1, table2) {
CALL myproc
%report (table1) {
...
%row { ... %}
...
%}
%report (table1) {
...
%row { ... %}
...
%}
%}
E' possibile trasferire i parametri ad una procedura memorizzata ed è possibile che questa aggiorni i valori di parametro in modo che il nuovo valore venga riportato di nuovo alla macro di Net.Data. Il parametro viene trasferito alla procedura memorizzata specificando il nome parametro con la parola chiave IN. Se la procedura memorizzata deve aggiornare il parametro, è necessario trasferire il parametro per il valore restituito con le parole chiave INOUT o OUT. Il tipo di dati specificato per un parametro deve corrispondere a ciò che la procedura memorizzata prevede.
Esempio 1: Trasferimento di un valore di parametro alla procedura memorizzata
%function (dtw_sql) mystoredproc (IN CHAR(30) valuein) {
CALL myproc
...
Esempio 2: Restituzione di un valore da una procedura memorizzata
%function (dtw_sql) mystoredproc (OUT VARCHAR(9) retvalue) {
CALL myproc
...
Da una procedura memorizzata è possibile restituire una o più serie di risultati. Le serie di risultati possono essere memorizzate nelle tabelle di Net.Data per ulteriori elaborazioni all'interno della macro o anche visualizzate tramite un blocco REPORT. E' necessario associare un nome ad ogni serie di risultati generata dalla proceudra memorizzata. Ciò viene reso possibile specificando i parametri sull'istruzione FUNCTION. Il nome specificato per una serie di risultati può quindi essere associato ad un blocco REPORT o ad una tabella di Net.Data, consentendo di stabilire come ogni serie di risultati viene elaborata da Net.Data. E' possibile:
Le serie di risultati vengono sempre memorizzate nelle tabelle locali in modo che un'altra funzione possa utilizzare i dati in un secondo momento all'interno del file della macro. Ad esempio, è possibile trasferire una tabella di Net.Data ad un'altra funzione in modo da poter utilizzare i dati per i calcoli e visualizzare i risultati in base a questi calcoli.
Consultare Indicazioni e limiti per i blocchi REPORT multipli per indicazioni e limiti quando vengono utilizzati i blocchi di prospetto multipli.
Per restituire una singola serie di risultati e visualizzarla utilizzando un prospetto predefinito:
Utilizzare la seguente sintassi:
%function (dtw_sql)
nome_funzione (OUT nometabella) {
CALL procedura_memorizzata
%}
Ad esempio:
%function (dtw_sql) mystoredproc(OUT mytable1) {
CALL myproc
%}
Per restituire una singola serie di risultati e specificare un blocco REPORT per l'elaborazione di visualizzazione:
Utilizzare la seguente sintassi:
%function (dtw_sql)
nome_funzione (OUT nometabella) {
CALL procedura_memorizzata
%REPORT (nomeseriedirisultati) {
...
%}
%}
Ad esempio:
%function (dtw_sql) mystoredproc (OUT mytable1) {
CALL myproc
%REPORT (mytable1) {
...
%row { ... %}
...
%}
%}
In alternativa, è possibile utilizzare la seguente sintassi:
%function (dtw_sql) nome_funzione () {
CALL procedura_memorizzata
%REPORT () {
...
%}
%}
Ad esempio:
%function (dtw_sql) mystoredproc () {
CALL myproc
%REPORT {
...
%row { ... %}
...
%}
%}
Per restituire più serie di risultati e visualizzarli utilizzando la formattazione di prospetto predefinito:
Utilizzare la seguente sintassi:
%function (dtw_sql)
nome_funzione (OUT tablename1, tablename2) {
CALL procedura_memorizzata
%}
Dove non viene specificato alcun blocco di prospetto.
Ad esempio:
%define DTW_DEFAULT_REPORT = "MULTIPLE"
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%}
Per restituire più serie di risultati e specificare blocchi REPORT per l'elaborazione di visualizzazione:
Ogni serie di risultati viene associata al proprio blocco REPORT. Utilizzare la seguente sintassi:
%function
(dtw_sql) nome_funzione ( OUT tablename1, tablename2) {
CALL procedura_memorizzata
%REPORT(nomeseriedirisultati1)
...
%row { ... %}
...
%}
%REPORT (nomeseriedirisultati2)
...
%row { ... %}
...
%}
%}
Ad esempio:
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%REPORT (mytable1) {
...
%row { ... %}
...
%}
%REPORT(mytable2) {
...
%row { ... %}
...
%}
%}