版次注意事項


34.4 第 5 章 開發 SQL 程序

34.4.1 設定 SQL 程序環境

下列是關於在「安裝」中設定 DB2 環境指示的附加說明。

|若需 SQL 程序支援,您必須在伺服器上安裝「應用程式開發從屬站 |(Application Development Client)」。若需安裝「應用程式開發從屬站」的相關資訊, |請參照適用您的平台的 快速入門 書籍。若需您平台中 DB2 支援的 C 及 C++ 編譯器的相關資訊, |請參閱「平台支援的軟體」。

註:
在 OS/2 FAT 檔案系統上,「SQL 程序」的綱目名稱限制為八個字元以下。 綱目名稱若長於八個字元,則必須使用 HPFS 檔案系統。

編譯器架構由兩部分組成: 設定編譯器的環境變數及定義編譯指令。 環境變數提供編譯器的二進位檔(bin)、檔案庫(lib)及併入檔的路徑。 編譯指令是 DB2 將用來編譯 SQL 程序所產生的 C 檔案的完整指令。

34.4.2 設定編譯器環境變數

在 OS/2、Windows 及 UNIX 作業系統上配置環境有不同的規則, 如下所示。 在部分的情況下,不需要作架構;在其它情形時, DB2_SQLROUTINE_COMPILER_PATH DB2 登錄變數必須設定為指向一個 適當的設定環境變數的可執行 Script。

註:
|您可使用 db2set 指令或使用「儲存程序建置器」的 |「SQL 儲存程序建置選項」對話框來設定這個 DB2 登錄變數的值。使用「SQL 儲存程序建置選項」對話框 |不需要實際存取資料庫伺服器,資料庫伺服器也不用重新啟動以使變更生效。 |

在 OS/2 上:

針對 IBM VisualAge C++ for OS/2 版本 3.6:
 
   db2set DB2_SQLROUTINE_COMPILER_PATH="c:\ibmcxxo\bin\setenv.cmd"
 
針對 IBM VisualAge C++ for OS/2 版本 4:
 
   db2set DB2_SQLROUTINE_COMPILER_PATH="c:\ibmcpp40\bin\setenv.cmd"

註:
這些指令是假設 C++ 編譯器是安裝在 C: 磁碟機上。 如果需要,變更磁碟機或路徑來反映您系統上 C++ 編譯器的位置。

在 Windows 32 位元作業系統上,如果編譯器的環境變數是設定為 SYSTEM 變數, 則不需要作任何配置。 否則,請將 DB2_SQLROUTINE_COMPILER_PATH DB2 登錄變數設定為:

針對 Microsoft Visual C++ 版本 5.0:
 
      db2set DB2_SQLROUTINE_COMPILER_PATH="c:\devstudio\vc\bin\vcvars32.bat"
 
針對 Microsoft Visual C++ 版本 6.0:
 
      db2set DB2_SQLROUTINE_COMPILER_PATH="c:\Micros~1\vc98\bin\vcvars32.bat"
 
針對 IBM VisualAge C++ for Windows 版本 3.6:
 
      db2set DB2_SQLROUTINE_COMPILER_PATH="c:\ibmcxxw\bin\setenv.bat"
 
針對 IBM VisualAge C++ for Windows 版本 4:
 
      db2set DB2_SQLROUTINE_COMPILER_PATH="c:\ibmcppw40\bin\setenv.bat"

註:
這些指令是假設 C++ 編譯器是安裝在 C: 磁碟機上。 如果需要,變更磁碟機或路徑來反映您系統上 C++ 編譯器的位置。

在 UNIX 作業系統上,DB2 會在您第一次編譯儲存程序時產生可執行的 Script 檔 $HOME/sqllib/function/routine/sr_cpath (包含編譯器環境變數的預設值)。 您可編輯此檔案,如果預設值不適用於您的編譯器。 另外,您可將 DB2_SQLROUTINE_COMPILER_PATH DB2 登錄變數設為包含另一個可執行 Script 的完整路徑名稱,在 Script 內指定期望的值 (請看上面的範例)。

34.4.3 自訂編譯指令

Application Development Client 的安裝提供了一個預設的編譯指令, 至少可用於每個平台上支援的編譯器之一:

   AIX:IBM C Set++ for AIX 版本 3.6.6
   Solaris:SPARCompiler C++ 版本 4.2 及 5.0
   HP-UX:HP-UX C++ 版本 A.12.00
   Linux:GNU/Linux g++ 版本 egcs-2.90.27 980315 (egcs-1.0.2 release)
   PTX:ptx/C++ 版本 5.2
   OS/2:IBM VisualAge C++ for OS/2 版本 3
   Windows NT 及 Windows 2000:Microsoft Visual C++ 版本 5.0 及 6.0

若要使用其它編譯器,或要自訂預設指令, 您必須將 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登錄變數設為如下的指令:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=compilation_command

其中 compilation_command 是 C 或 C++ 編譯指令, 包括建立儲存程序所需的選項及參數。

在編譯指令中,請使用關鍵字 SQLROUTINE_FILENAME 來取代所產生的 SQC、C、PDB、DEF、EXP、 訊息日誌及共用檔案庫檔案的檔名。僅針對 AIX,使用 SQLROUTINE_ENTRY 關鍵字來取代登錄名稱。

註:
您可使用 db2set 指令或使用「儲存程序建置器」的 「SQL 儲存程序建置選項」對話框來設定這個 DB2 登錄變數的值。使用「SQL 儲存程序建置選項」對話框 不需要實際存取資料庫伺服器,資料庫伺服器也不用重新啟動以使變更生效。

下列是 C 或 C++ 編譯器在支援的伺服器平台的 DB2_SQLROUTINE_COMPILE_COMMAND 預設值。

AIX

使用 IBM C for AIX 版本 3.6.6:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=xlc -H512 -T512 \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c -bE:SQLROUTINE_FILENAME.exp \
   -e SQLROUTINE_ENTRY -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2

使用 IBM C Set++ for AIX 版本 3.6.6:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=xlC -H512 -T512 \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c -bE:SQLROUTINE_FILENAME.exp \
   -e SQLROUTINE_ENTRY -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

註:
若要在 AIX 上編譯 64 位元 SQL 程序,將 -q64 選項新增到上面的指令。
使用 IBM VisualAge C++ for AIX 版本 4:
   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld"

若您在 vacbld 指令之後沒有指定架構檔,DB2 會在首次建立 SQL 程序時, 建立下列預設的架構檔。

   $HOME/sqllib/function/routine/sqlproc.icc

若您要使用自己的架構檔,可在設定 DB2_SQLROUTINE_COMPILE_COMMAND 的 DB2 登記值時, 指定您要使用的架構檔:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld
   %DB2PATH%/function/sqlproc.icc"

HP-UX

使用 HP C 編譯器版本 A.11.00.03:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=cc +DAportable +ul -Aa +z \
   -I$HOME/sqllib/include -c SQLROUTINE_FILENAME.c; \
   ld -b -o SQLROUTINE_FILENAME SQLROUTINE_FILENAME.o \
   -L$HOME/sqllib/lib -ldb2

使用 HP-UX C++ 版本 A.12.00:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=CC +DAportable +a1 +z -ext \
   -I$HOME/sqllib/include -c SQLROUTINE_FILENAME.c; \
   ld -b -o SQLROUTINE_FILENAME SQLROUTINE_FILENAME.o \
   -L$HOME/sqllib/lib -ldb2

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

Linux

使用 GNU/Linux gcc 版本 2.7.2.3:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=cc \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -shared -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -ldb2

使用 GNU/Linux g++ 版本 egcs-2.90.27 980315 (egcs-1.0.2 版次):

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=g++ \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -shared -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -ldb2

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

PTX

使用 ptx/C 版本 4.5:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=cc -KPIC \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -G -o SQLROUTINE_FILENAME.so -L$HOME/sqllib/lib -ldb2 ; \
   cp SQLROUTINE_FILENAME.so SQLROUTINE_FILENAME

使用 ptx/C++ 版本 5.2:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=c++ -KPIC \
   -D_RWSTD_COMPILE_INSTANTIATE=0
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -G -o SQLROUTINE_FILENAME.so -L$HOME/sqllib/lib -ldb2 ; \
   cp SQLROUTINE_FILENAME.so SQLROUTINE_FILENAME

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

OS/2

使用 IBM VisualAge C++ for OS/2 版本 3:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="icc -Ge- -Gm+ -W2
   -I%DB2PATH%\include SQLROUTINE_FILENAME.c
   /B\"/NOFREE /NOI /ST:64000\" SQLROUTINE_FILENAME.def
   %DB2PATH%\lib\db2api.lib"

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

使用 IBM VisualAge C++ for OS/2 版本 4:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld"

若您在 vacbld 指令之後沒有指定架構檔,DB2 會在首次建立 SQL 程序時, 建立下列預設的架構檔。

   %DB2PATH%\function\routine\sqlproc.icc

若您要使用自己的架構檔,可在設定 DB2_SQLROUTINE_COMPILE_COMMAND 的 DB2 登記值時, 指定您要使用的架構檔:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld
   %DB2PATH%\function\sqlproc.icc"

Solaris

使用 SPARCompiler C 版本 4.2 和 5.0:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=cc -xarch=v8plusa -Kpic \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -G -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib \
   -R$HOME/sqllib/lib -ldb2

使用 SPARCompiler C++ 版本 4.2 和 5.0:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=CC -xarch=v8plusa -Kpic \
   -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
   -G -o SQLROUTINE_FILENAME -L$HOME/sqllib/lib \
   -R$HOME/sqllib/lib -ldb2

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

註:

  1. -xarch=v8plusa 編譯器選項已新增到預設編譯器指令。有關為何新增此選項的細節,請參閱34.8, "第 12 章 開發 Solaris 應用程式"

  2. 若要在 Solaris 上編譯 64 位元 SQL 程序,取消 -xarch=v8plusa 選項,並將 -xarch=v9 選項新增到上面的指令。

Windows NT 和 Windows 2000

註:
Windows 98 或 Windows 95 不支援 SQL 程序。

使用 Microsoft Visual C++ 版本 5.0 和 6.0:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=cl -Od -W2 /TC -D_X86_=1
   -I%DB2PATH%\include SQLROUTINE_FILENAME.c /link -dll
   -def:SQLROUTINE_FILENAME.def /out:SQLROUTINE_FILENAME.dll
   %DB2PATH%\lib\db2api.lib

若沒有設定 DB2_SQLROUTINE_COMPILE_COMMAND DB2 登記變數,則這是預設編譯指令。

使用 IBM VisualAge C++ for Windows 版本 3.6:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="ilib /GI
   SQLROUTINE_FILENAME.def &icc -Ti -Ge- -Gm+ -W2
   -I%DB2PATH%\include SQLROUTINE_FILENAME.c
   /B\"/ST:64000 /PM:VIO /DLL\" SQLROUTINE_FILENAME.exp
   %DB2PATH%\lib\db2api.lib"

使用 IBM VisualAge C++ for Windows 版本 4:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld"

若您在 vacbld 指令之後沒有指定架構檔,DB2 會在首次建立 SQL 程序時, 建立下列預設的架構檔。

   %DB2PATH%\function\routine\sqlproc.icc

若您要使用自己的架構檔,可在設定 DB2_SQLROUTINE_COMPILE_COMMAND 的 DB2 登記值時, 指定您要使用的架構檔:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND="vacbld
   %DB2PATH%\function\sqlproc.icc"

若要傳回預設編譯器選項,以下列指令將 DB2_SQLROUTINE_COMPILE_COMMAND 的 DB2 登記值 設定為 NULL:

   db2set DB2_SQLROUTINE_COMPILE_COMMAND=

34.4.4 保留中間檔

當 SQL 程序沒有成功建立時,您必須手動刪除被丟棄的中間檔。這些檔案位於下列目錄裡:

UNIX
$DB2PATH/function/routine/sqlproc/$DATABASE/$SCHEMA/tmp

在此 $DB2PATH 是建立案例的目錄,$DATABASE 是資料庫名稱, 而 $SCHEMA 是用來建立 SQL 程序的綱目名稱。

OS/2 和 Windows
%DB2PATH%\function\routine\sqlproc\%DATABASE%\%SCHEMA%\tmp

其中 %DB2PATH% 代表建立案例的目錄,%DATABASE% 代表資料庫名稱, 而 %SCHEMA% 代表用來建立 SQL 程序的綱目名稱。

34.4.5 備份和復置

在建立 SQL 程序時,產生的共用檔案庫/DLL 也會保留在型錄表格中, 如果產生的共用檔案庫/DLL 小於 2 MB。 在備份及復置資料庫時,任何產生的共用檔案庫/DLL 小於 2 MB 的 SQL 程序會使用 型錄表格中所保留的版本來做備份及復置。 如果您有產生的共用檔案庫/DLL 大於 2 MB 的 SQL 程序, 請確定您也用資料庫備份及復置來做檔案系統的備份及復置。 如果沒有,您必須使用 syscat.procedures 型錄表格中的來源自行重建 SQL 程序的共用檔案庫/DLL。

註:
在資料庫回復時,所有檔案系統上屬於被回復資料庫的 SQL 程序可執行檔會被移除。 如果索引建立架構參數 (indexrec) 設為 RESTART,就會從型錄表格擷取所有 SQL 程序可執行檔, 並於下次連接時放回檔案系統。 否則,SQL 可執行檔會在 SQL 程序第一次執行時擷取。
可執行檔會被放回到下列目錄:

UNIX
$DB2PATH/function/routine/sqlproc/$DATABASE

在此 $DB2PATH 是建立案例的目錄,而 $DATABASE 是用來建立 SQL 程序的資料庫名稱。

OS/2 和 Windows
%DB2PATH%\function\routine\sqlproc\%DATABASE%

其中 %DB2PATH% 代表建立案例的目錄, 而 %DATABASE% 代表用來建立 SQL 程序的資料庫名稱。

34.4.6 建立 SQL 程序

將資料庫管理程式的架構參數 KEEPDARI 設定為 'NO',以建置 SQL 程序。 若 SQL 程序一旦執行時維持載入狀態,要以同名捨棄和重建儲存程序時可能會遭遇問題, 如同檔案庫無法復新,而可執行檔無法從檔案系統捨棄。當您嘗試復原變更或捨棄資料庫時也會遭遇問題,因為無法刪除可執行檔。

請參閱「應用程式開發手冊,第 2 章 設定」的「更新資料庫管理程式架構檔」,以取得設定 KEEPDARI 參數的詳細資訊。

註:
SQL 程序不支援下列參數的資料類型:

34.4.7 呼叫儲存程序

「使用呼叫指令」中的第一段應該讀取:

欲使用呼叫指令,請輸入儲存程序名稱,以及 IN 或 INOUT 的參數,還有被視為每一個輸出參數之位置保留符號 '?'。 若要取得 CALL 指令的詳細語法,請參閱10.14, "CALL"

|34.4.8 分送已編譯的 SQL 程序

|註:
若要在 DB2 伺服器之間分送已編譯的 SQL 程序, |您必須對於每一個會作為已編譯 SQL 程序的來源 (或目標) 的 DB2 伺服器執行下列步驟:

|

步驟  1.

安裝 FixPak 3

步驟  2.

發出 db2updv7 指令以啟用 DB2 來取出及安裝已編譯的 SQL 程序:

     db2updv7 -d database_name 

|

|當您定義一個 SQL 程序時,它會轉換為一個 C 程式、預先編譯過、 |對目標資料庫連結、編譯並鏈結以建立一個共用檔案庫。 |編譯及鏈結的步驟需要在資料庫伺服器機器上有可用的 C 或 C++ 編譯器。然而,您在定義 SQL 程序時, |您可將它以已編譯的形式分送到在相同平台上執行的 DB2 資料庫, |而不需要可存取 C 或 C++ 編譯器。DB2 容許使用者從一個資料庫取出已編譯形式的 SQL 程序, |以及安裝已編譯形式的 SQL 程序到另一個資料庫。

|DB2 提供了指令行介面及程式設計介面來執行取出及安裝作業。指令行介面由兩個 CLP 指令組成: |GET ROUTINE 及 PUT ROUTINE。程式設計介面由兩個內建儲存程序組成:GET_ROUTINE_SAR |及 PUT_ROUTINE_SAR。有關指令行介面的詳細資訊,請參照 Command Reference。有關程式設計介面的詳細資訊, |請參照 SQL Reference。

|若要從一個資料庫伺服器分送已編譯的 SQL 程序到另一個資料庫伺服器, |請執行下列步驟:

|

步驟  1.

開發應用程式,包括定義為應用程式部分的 SQL 程序。

步驟  2.

在測試程序後,將每一個程序的已編譯版本取出到一個不同的檔案。 若需詳細資訊,請參照 Command Reference 中的 GET ROUTINE 指令或 SQL Reference 中的 GET_ROUTINE_SAR 儲存程序。

步驟  3.

在每一台伺服器上安裝每一個程序的已編譯版本, 您可發出 PUT ROUTINE 指令,或呼叫 PUT_ROUTINE_SAR 儲存程序 (使用 2 所建立的檔案)。每一個資料庫伺服器的作業系統及 DB2 層次必須相同。


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]