儲存程序是一種已編譯的程式,儲存於 DB2 中, 可執行 SQL 陳述式。在 Net.Data 中,儲存程序是從 Net.Data 函數上使用 CALL 陳述式來呼叫。 儲存程序參數是從 Net.Data 函數參數列示中來傳入。您可以使用儲存程序, 經由保存編譯過的 SQL 陳述式和資料庫伺服器,來改善執行效能和提升完整性。 Net.Data 支援透過 SQL 與 ODBC 語言環境,以 DB2 使用儲存程序。
本段落說明下列主題:
儲存程序的語法使用 FUNCTION 陳述式、CALL 陳述式,以及可選用的 REPORT 區塊。
%FUNCTION function_name ([IN datatype arg1, INOUT datatype arg2,
OUT tablename, ...]) {
CALL stored_procedure
[%REPORT [(resultsetname)] { %}]
[%REPORT [(resultsetname)] { %}]
[%MESSAGE %}]
%}
其中:
| CHAR | FLOAT | SMALLINT |
| DATE | GRAPHIC | TIME |
| DECIMAL | INTEGER | TIMESTAMP |
| DOUBLE | REAL | VARCHAR |
| DOUBLEPRECISION |
| VARGRAPHIC |
|
|
|
|
|
|
|
|
%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 巨集。 函數參數列示上的參數數目及類型必須符合針對儲存程序定義的數目及類型。 例如,如果針對儲存程序定義的參數列示上的參數為 INOUT, 則函數參數列示上對應的參數必須是 INOUT。例如,如果針對儲存程序定義的參數列示上的參數為類型 CHAR(30), 則函數參數列示上對應的參數也必須是 CHAR(30)。
範例:傳送參數值至儲存程序
%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein) {
CALL myproc
範例:從儲存程序傳回值
%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue) {
CALL myproc
您可以使用 SQL 或 ODBC 語言環境,從儲存程序。 結果集合可以儲存在 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 [(resultsetname)]
%REPORT [(resultsetname)] {
...
%}
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
CALL myproc
%REPORT {
...
%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 = "YES"
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%}
若要傳回多個結果集合並設定 REPORT 區塊來進行處理顯示:
每一個結果集合均會與它的一個或多個 REPORT 區塊 產生關聯。可使用下列語法:
%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) {
CALL stored_procedure
%REPORT (tablename1)
...
%ROW { ... %}
...
%}
%REPORT (tablename2)
...
%ROW { ... %}
...
%}
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%REPORT(mytable1) {
...
%ROW { ... %}
...
%}
%REPORT(mytable2) {
...
%ROW { ... %}
...
%}
%}