儲存程序是一種已編譯的程式,儲存於 DB2 本端或遠端伺服器上, 可執行 SQL 陳述式。在 Net.Data 中,儲存程序是從 Net.Data 函數上使用 CALL SQL 陳述式來呼叫。 儲存程序參數是從 Net.Data 函數參數列示中來傳入。您可以使用儲存程序, 經由保存編譯過的 SQL 陳述式和資料庫伺服器,來改善執行效能和提升完整性。
本段落說明下列主題:
儲存程序的語法使用 FUNCTION 陳述式、CALL 陳述式,以及可選用的 REPORT 區塊。
%function (dtw_sql) function_name ([IN datatype arg1, INOUT datatype arg2,
OUT tablename, ...])
CALL stored_procedure
[%REPORT(resultsetname...)]
其中:
| CHAR | FLOAT | TIME |
| DATE | GRAPHIC | TIMESTAMP |
| DECIMAL | INTEGER | VARCHAR |
| DOUBLE | REAL | VARGRAPHIC |
| DOUBLEPRECISION | SMALLINT |
|
|
|
|
|
|
|
|
|
欲呼叫儲存程序時:
%function (dtw_sql) function_name()
%function (dtw_sql) function_name (IN datatype arg1, INOUT datatype arg2, OUT tablename...)
CALL stored_procedure
%report {
...
%}
範例:
%function (dtw_sql) mystoredproc (IN CHAR(30)
arg1 OUT mytable) {
CALL myproc
%report {
...
%row { ... %}
...
%}
%}
%function (dtw_sql) function_name (OUT tablename, ...)
%REPORT(resultsetname1) {
...
%}
範例:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1, OUT table1, table2) {
CALL myproc
%report (table1) {
...
%row { ... %}
...
%}
%report (table1) {
...
%row { ... %}
...
%}
%}
您可以將參數傳遞給儲存程序,並使儲存程序更新參數值, 以便新值將傳回到 Net.Data 巨集。您可以經由以 IN 參數設定參數, 將參數傳遞給儲存程序。如果儲存程序將更新參數,則您須以 INOUT 或 OUT 關鍵字, 傳遞回覆值的參數。針對參數設定的資料類型須符合儲存程序所期望的資料類型。
範例:傳送參數值至儲存程序
%function (dtw_sql) mystoredproc (IN CHAR(30) valuein) {
CALL myproc
...
範例:從儲存程序傳回值
%function (dtw_sql) mystoredproc (OUT VARCHAR(9) retvalue) {
CALL myproc
...
您可以從儲存程序傳回一個或多個結果集合。結果集合可以儲存在 Net.Data 表格中, 以便在您的巨集內進一步處理它們,或使用 REPORT 區塊顯示它們。 您必須使名稱與儲存程序所建立的每一個結果集合產生關聯。 這是經由在 FUNCTION 陳述式上設定參數來完成。然後,您針對結果集合設定的名稱可以與 REPORT 區塊或 Net.Data 表格產生關聯, 使您能夠決定 Net.Data 將如何處理每一個結果集合。您可以:
結果集合恆會儲存在區域表格中,以便另一個函數稍後可以在巨集中使用資料。 例如,您可以將 Net.Data 表格傳遞給另一個函數, 以便它可以使用資料來進行計算,並依據那些計算來顯示結果。
請參閱多個 REPORT 區塊的指南與限制,取得當使用多個報表區塊時的指南與限制。
若要傳回單一結果集合,並使用預設報表顯示它:
可使用下列語法:
%function (dtw_sql) function_name
(OUT tablename) {
CALL stored_procedure
%}
例如:
%function (dtw_sql) mystoredproc(OUT mytable1) {
CALL myproc
%}
若要傳回單一結果集合並設定一個 REPORT 區塊進行顯示處理:
可使用下列語法:
%function (dtw_sql) function_name
(OUT tablename) {
CALL stored_procedure
%REPORT (resultsetname) {
...
%}
%}
例如:
%function (dtw_sql) mystoredproc (OUT mytable1) {
CALL myproc
%REPORT (mytable1) {
...
%row { ... %}
...
%}
%}
另一種方式即是使用下列語法:
%function (dtw_sql) function_name () {
CALL stored_procedure
%REPORT () {
...
%}
%}
例如:
%function (dtw_sql) mystoredproc () {
CALL myproc
%REPORT {
...
%row { ... %}
...
%}
%}
若要傳回多個結果集合並使用預設報表格式顯示它們:
可使用下列語法:
%function (dtw_sql) function_name
(OUT tablename1, tablename2) {
CALL stored_procedure
%}
其中沒有報表區塊。
例如:
%define DTW_DEFAULT_REPORT = "MULTIPLE"
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%}
若要傳回多個結果集合並設定 REPORT 區塊來進行處理顯示:
每一個結果集合均會與它自己的 REPORT 區塊產生關聯。可使用下列語法:
%function (dtw_sql) function_name (OUT tablename1, tablename2) {
CALL stored_procedure
%REPORT (resultsetname1)
...
%row { ... %}
...
%}
%REPORT (resultsetname2)
...
%row { ... %}
...
%}
%}
例如:
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%REPORT(mytable1) {
...
%row { ... %}
...
%}
%REPORT(mytable2) {
...
%row { ... %}
...
%}
%}