管理及程式設計指南

關聯式資料庫語言環境

Net.Data 會提供關聯式資料庫語言環境,來協助您存取關聯式資料來源。 您提供以存取關聯式資料的 SQL 陳述式,將當作動態 SQL 來執行。關於動態 SQL 的進一步資訊,請參閱您的 DB2 文件。

下列各節將描述語言環境,並告訴您如何使用它們:

ODBC 語言環境

ODBC 語言環境會透過 ODBC 介面來執行 SQL 陳述式。 ODBC 是架構在 X/Open SQL CAE 規格上,它可以讓單一應用程式存取許多資料庫管理系統。

若要使用 ODBC 語言環境:

若要使用 ODBC 語言環境,首先您要取得並安裝 ODBC 驅動程式以及 ODBC 驅動程式的管理程式。您的 ODBC 驅動程式文件會描述如何安裝及架構 ODBC 環境。

請驗證下列架構陳述式是否在 Net.Data 起始設定檔案中,且位在同一行上。

ENVIRONMENT (DTW_ODBC) d:/net.data/lib/dtwodbc.dll ( IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

限制:

Oracle 語言環境

Oracle 語言環境提供 Oracle 資料的原始存取權。 當使用 CGI、FastCGI、NSAPI、ISAPI 或 GWAPI時,您可以從 Net.Data 存取 Oracle 資料庫。 這個語言環境將支援 Oracle 7.2, 7.3 及 8.0。

若要使用 Oracle 語言環境,請驗證下列架構陳述式是否在起始設定檔案中,且位在同一行上。

ENVIRONMENT (DTW_ORA) /net.data/lib/dtwora.so (IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

請參閱設置 Oracle 語言環境,以學習如何更進一步地設置 Oracle 語言環境。

限制:

SQL 語言環境

SQL 語言環境提供 DB2 資料庫的存取權。當存取 DB2 時,請使用這個語言環境,以取得最佳效能。

若要使用 SQL 語言環境,請驗證下列架構陳述式是否在起始設定檔案中,且位在同一行上。

ENVIRONMENT (DTW_SQL) d:/net.data/lib/dtwsql.dll (IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

巢狀結構的 SQL 陳述式

您可以在 SQL 函數中呼叫另一個 SQL 函數。如果有傳遞表格, 請確定每一個函數中使用唯一的表格名稱;否則可能發生無法預期的結果。

範例:從 SQL 函數的 ROW 區塊呼叫另一個 SQL 函數

%define mytable1 = %TABLE
%define mytable2 = %TABLE
 
%FUNCTION(DTW_SQL) sql2 (IN p1, OUT t2) {
   select * from NETDATA.STAFFINF where projno='$(p1)'
%REPORT {
  %ROW { $(N1) is $(V1) %}
 %}
%}
 
%FUNCTION(DTW_SQL) sql1 (OUT t1) {
   select * from NETDATA.STAFFINF
%REPORT {
   %ROW { @sql2(V1, mytable2) %}
 %}
%}
 
%HTML(netcall1) { @sql1(mytable1) %}

限制:

列入陳述式區塊中的 SQL 陳述式最多可達到 64 KB。 DB2 Universal Database 具有下列限制:

您的資料庫可能具有不同的限制:請參閱資料庫文件, 來決定 DBMS 是否具有不同限制。

巢狀化的 SQL 僅可以使用於 SQL 或 ODBC 語言環境中, 且無法與「現場連線」一起使用。

當 SQL 陳述式巢狀化時,結果集的最大數值為 32。例如,您可以將三個層次巢狀化, 每一個層次皆傳回 10 個結果集。或者,將 32 層次巢狀化,則每一個層次傳回一個結果集。

管理 Net.Data 應用程式中的異動

當您使用插入、刪除或更新陳述式來修改資料庫的內容時,修改的內容將不會變成永久的, 除非資料庫從 Net.Data 收到一個確定陳述式。如果發生錯誤,則 Net.Data 將傳送一個回轉陳述式給資料庫, 反轉自上次確定後所做的任何修改。

根據 TRANSACTION_SCOPE 的設定以及在巨集中是否明確指定 COMMIT 陳述式, 決定 Net.Data 傳送 COMMIT 和可能的 Rollback 方法。 TRANSACTION_SCOPE 的值是 MULTIPLE 及 SINGLE。

SINGLE

指定在每一個 SQL 陳述式順利完成後,Net.Data 將發出一個確定陳述式。如果 SQL 陳述式傳回錯誤,將發出回轉陳述式。 單一異動範圍可立即保障資料庫的修改;不過,使用這個範圍後,稍後可能無法使用回轉陳述式來還原修改的內容。

若要啟動這個確定方法,請將 TRANSACTION_SCOPE 設定為 SINGLE。例如:

@DTW_ASSIGN(TRANSACTION_SCOPE,"SINGLE")
 

MULTIPLE

指定在發出確定及可能回轉陳述式之前,Net.Data 將執行所有 SQL 陳述式。 在要求結束時,Net.Data 會傳送確定,而且如果順利發出了每一個 SQL 陳述式, 則確定將使得資料庫中的所有修改內容變成永久的。如果任一陳述式傳回錯誤, 則 Net.Data 將發出回轉陳述式,將資料庫設定回它的原始狀態。 如果未設定 TRANSACTION_SCOPE,MULTIPLE 將是預設值。

您可以使用 COMMIT SQL 陳述式,在巨集中的任一 SQL 陳述式結束時, 發出一個確定陳述式。經由使 TRANSACTION_SCOPE 設定為 MULTIPLE, 並在那些您覺得已合格作為異動的陳述式群組結束時發出確定陳述式,您 (應用程式軟體開發者) 便可以完全控制應用程式中的確定及回轉行為。 例如,在完成您的巨集中的每一次更新後發出確定陳述式,可協助您確保資料的完整性。

若要發出 SQL 確定陳述式,您可以定義一個可在您的 HTML 區塊中任一點呼叫的函數:

%FUNCTION(DTW_SQL) user_commit() {
  commit
%}
 
...
 
%HTML {
  ...
  @user_commit()
  ...
%}
 

限制:

連接資料庫之後就無法變更 TRANSACTION_SCOPE 的設定。 因此,巨集中的所有 SQL 異動屬於相同範圍。

若使用 Net.Data 作為 Net.Commerce 的一部份, 請注意 Net.Commerce 有自己的異動處理並停用 Net.Data 的異動處理。

使用大型物件

您可以在 DB2 資料庫中儲存大型物件檔案 (LOB), 並使用 Net.Data SQL 或 ODBC 語言環境將這些檔案納入動態網頁。

當語言環境執行的 SQL SELECT 陳述式或儲存程序傳回 LOB,語言環境並不會將物件指定到 V(n) 表格處理變數或 Net.Data 表格欄位。它是將 LOB 儲存在 Net.Data 所建立的一個檔案, 而在 V(n) 表格處理變數或 Net.Data 表格欄位中僅傳回檔名。 您可以在 Net.Data 巨集中使用該名稱來參照 LOB 檔案; 例如您可以建立具有超本文參照的 HTML 基準元素或包含檔案 URL 的影像元素。 Net.Data 將包含 LOB 的檔案放置在 HTML_PATH 路徑陳述式所指定的目錄, 此陳述式位於 Net.Data 起始設定檔案 (db2www.ini)。 LOB 檔案的寫入權僅限於要求擷取該 LOB 的相關 Net.Data 使用者 ID。

動態建構 LOB 檔名,格式如下︰

名稱[.副檔名]

其中:

名稱
動態建立、識別大型物件的唯一字串。

副檔名
定義物件類型的字串。CLOBs 及 DBCLOBs 類型的副檔名是 .txt。 針對 BLOBs,SQL 語言環境會在 LOB 檔案的前幾個位元組中尋找標記,以決定其副檔名。表 8顯示 SQL 語言環境使用的 LOB 副檔名。

表 8. SQL 語言環境使用的 LOB 副檔名
副檔名 物件類型
.bmp 點陣圖影像檔
.gif 圖形式影像格式
.jpg JPEG 圖形檔格式影像檔
.tif 標示影像檔格式
.ps postscript
.mid MIDI 音效檔
.aif AIFF 音效檔
.avi 音效視覺化交錯音效檔
.au 基本音效檔
.ra 實際音效檔
.wav windows 音效視覺化
.pdf 可攜性文件格式
.rmi midi 順序

如果未辨識出 BLOB 的物件類型,則檔名不會加上副檔名。

Net.Data 傳回的檔案包含 LOB 時,它會在檔名前置字串 /tmplobs/,語法如下︰

/tmplobs/名稱.[副檔名]

這個字首可讓您在 Web 伺服器文件根目錄以外輕易找出 LOB 目錄。

若要確定對 LOB 檔案的參照已正確解析,請在您的 Web 伺服器架構檔中新增下列 Pass 指引︰

Pass    /tmplobs/*     <html_path>/tmplobs/*

<html_path> 是 Net.Data 起始設定檔案中指定給 HTML_PATH 路徑陳述式的值。

規劃要訣: 查詢所傳回的 LOB 會儲存在由 HTML_PATH 路徑架構變數所指定的目錄之檔案中。由於 LOB 會快速消耗資源,所以在使用 LOB 時,需考慮到系統限制問題。 您可能需要定期清除目錄或執行 dtwclean 常駐程式。相關資訊請參閱管理暫時 LOB。 建議您使用 DataLinks,這不需按照 SQL 語言環境的目錄來儲存檔案, 並得以提高效能,節省大量的系統資源。

範例︰下列應用程式使用 MPEG (.mpa) 音效檔案。 因為 SQL 語言環境不認得此種檔案類型,因此會使用 EXEC 變數,將 .mpa 副檔名附加至檔名。 此應用程式的使用者必須按一下檔名,以便呼叫 MPEG 音效檔檢視器。

%DEFINE{
docroot="/usr/lpp/internet/server_root/html"
myFile=%EXEC "rename $(docroot)$(filename) $(docroot)$(filename).mpa"
%}
%{ 其中 rename 是對作業系統執行檔案更名的指令 %}
%FUNCTION(DTW_SQL) queryData() {
SELECT Name, IDPhoto, Voice FROM RepProfile
%REPORT{
    <p>這是您已選取的資訊︰</p>
%ROW{
      @DTW_ASSIGN(filename, @DTW_rSUBSTR(V3, @DTW_rLASTPOS("/", V3)))
      $(myFile)
      $(V1) <img src="$(V2)">
            <a href="$(V3).mpa">Voice sample</a><p>
    %}
  %}
%}
 
%HTML(REPORT){
@queryData()
%}

如果 RepProfile 表格包含關於 Kinson Yamamoto 及 Merilee Lau 的資訊,執行 REPORT 區塊就會將下列 HTML 新增到所建立的網頁︰

<p>這是您已選取的資訊︰</p>
Kinson Yamamoto <img src="/tmplobs/p2345n1.gif">
<a href="/tmplobs/p2345n2.mpa">Voice sample</a><p>
Merilee Lau <img src="/tmplobs/p2345n3.gif">
<a href="/tmplobs/p2345n4.mpa">Voice sample</a><p>

前一個範例中的 REPORT 區塊,使用隱含的表格變數 V1、V2 與 V3。

LOB 的存取權︰

LOB 的預設 tmplobs 目錄位於 HTML_PATH 所指定的目錄下,Net.Data 起始設定檔案中提供此 HTML_PATH 路徑架構變數。 您可以使用任何使用者 ID 予以存取。如果 HTML_PATH 值有變更, 請確定 Web 伺服器執行所依據的使用者 ID 對 HTML_PATH 所指定的目錄具有寫入權 (相關資訊請參閱 HTML_PATH)。

管理暫時 LOB︰

Net.Data 會將暫時 LOB 儲存在 tmplobs 次目錄, 這個目錄位在 HTML_PATH 路徑架構變數中指定的目錄下。 這些檔案可能變得很大,您應該定期清除以維護最佳效能。

Net.Data 提供一個 dtwclean 常駐程式,可幫助您管理 tmplobs 目錄。dtwclean 使用埠 7127。

若要執行 dtwclean 常駐程式︰ 請在指令行視窗中輸入下列指令︰

dtwclean [-t xx] [-d|-l] 

其中:

-t
指定 dtwclean 清除目錄的間隔的旗號。

xx
指定 dtwclean 消除檔案之前,檔案在目錄中的保留時間 (以秒計)。此值沒有上下限。 預設是 3600 秒。

-d
指定除錯模式的旗號;追蹤資訊會顯示在指令視窗中。

-l
指定日誌記載模式的旗號;追蹤資訊會列印到日誌檔中。

儲存程序

儲存程序是儲存在 DB2 的編譯程式,它可執行 SQL 陳述式。 在 Net.Data,從 Net.Data 函數使用 CALL 陳述式來呼叫儲存程序。 儲存程序參數從 Net.Data 函數參數列示傳入。 藉由將編譯的 SQL 陳述式儲存在資料庫伺服器中, 儲存程序可以增進效能及完整性。Net.Data 支援在 DB2 透過 SQL 及 ODBC 語言環境使用儲存程序。

本節說明下列主題︰

儲存程序語法

儲存程序的語法使用 FUNCTION 陳述式、CALL 陳述式及選用 REPORT 區塊。

%FUNCTION (DTW_SQL) function_name ([IN datatype arg1, INOUT datatype arg2, 
    OUT tablename, ...]) {
  CALL stored_procedure [(resultsetname, ...)]
[%REPORT [(resultsetname)] { %}]
...
[%REPORT [(resultsetname)] { %}]
[%MESSAGE %}]
 
%}

其中:

function_name
起始呼叫儲存程序的 Net.Data 函數的名稱。

stored_procedure
儲存程序的名稱。

datatype
Net.Data 支援的一種資料庫資料類型,如表 9所示。參數列示指定的資料類型必須符合儲存程序的資料類型。 關於這些資料類型的詳細資訊,請參閱您的資料庫文件。

tablename
用來儲存結果集的 Net.Data 表格的名稱 (只有在結果集要儲存在 Net.Data 表格時才使用)。若有指定的話, 此參數必須符合 resultsetname 的相關參數名稱。

resultsetname
從儲存程序傳回的結果與 REPORT 區塊有關的名稱及 (或) 函數參數列示上的表格名稱。 REPORT 區塊上的 resultsetname 必須符合 CALL 陳述式上的結果集。

表 9. 支援的儲存程序資料類型
BIGINT DOUBLEPRECISION SMALLINT
CHAR FLOAT TIME
CLOB1 INTEGER TIMESTAMP
DATE GRAPHIC VARCHAR
DECIMAL LONGVARCHAR VARGRAPHIC
DOUBLE LONGVARGRAPHIC
1 CLOB 只能當作 OUT 及 INOUT 參數,並且 Net.Data 以位元組為單位解譯大小。 例如,如果您指定變數為 OUT CLOB(20000),表示 20K 大小的 CLOB 當作輸出參數。

呼叫儲存程序

  1. 定義用來起始呼叫儲存程序的函數。
    %FUNCTION (DTW_SQL) function_name() 
    
  2. (選用) 指定儲存程序的 IN、INOUT 或 OUT 參數, 包括 Net.Data 表格中用來儲存結果集的表格變數名稱 (當您要將結果集儲存在 Net.Data 表格時,才需要指定 Net.Data 表格)。 您也可以指定另一個儲存程序的表格名稱、結果集、IN 或 INOUT 參數。
    %FUNCTION (DTW_SQL) function_name (IN datatype
    arg1, INOUT datatype arg2, 
        OUT tablename...) 
    
  3. 使用 CALL 陳述式以識別儲存程序名稱。
     CALL stored_procedure
    
  4. 如果儲存程序要用來建立結果集,您可選擇指定 REPORT 區塊, 定義 Net.Data 顯示結果集的方式。
    %REPORT (resultsetname) {
    ...
    %}
    

    範例︰

    %FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1)  {
         CALL  myproc   
     %REPORT (mytable){
      ...
      %ROW {  ...   %}
      ...   
     %} 
    %}
    
  5. 如果儲存程序要用來建立一組以上的結果集︰

傳送參數

您可以將參數傳到儲存程序,讓儲存程序更新參數值,這樣新值就會傳回到 Net.Data 巨集。 函數參數列示上的參數數目及類型必須符合儲存程序已定義的數目及類型。 例如,如果儲存程序定義的參數列示上參數是 INOUT, 函數參數列示上的對應參數也必須是 INOUT。 如果儲存程序定義的列示上參數是 CHAR(30) 類型, 函數參數列示上的對應參數也必須是 CHAR(30)。

範例 1︰將參數值傳到儲存程序

%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein)  {
     CALL  myproc 
...

範例 2︰從儲存程序傳回值

%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue)  {
     CALL  myproc  
...

處理結果集

您可以透過 SQL 或 ODBC 語言環境,從儲存程序中取回一個或多個結果集。 結果集可以儲存在 Net.Data 表格中供您巨集進一步處理, 也可以使用 REPORT 區塊加以處理。如果儲存程序建立多重結果集, 您必須為儲存程序建立的每一個結果集命名。方法是在 CALL 陳述式上指定參數。 然後結果集的指定名稱就可以結合 REPORT 區塊或 Net.Data 表格,這讓您決定 Net.Data 處理每一個結果集的方式。 您可以︰

關於使用多重報表區塊的指示及限制,請參閱多個 REPORT 區塊的指南與限制

若要傳回單一結果集並使用預設報表︰

請使用下列語法︰

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure 
%}

例如:

 %FUNCTION (DTW_SQL) mystoredproc() {
     CALL  myproc 
%}

若要傳回單一結果集並指定 REPORT 區塊︰

請使用下列語法︰

%FUNCTION (DTW_SQL) function_name () {    
     CALL stored_procedure  [(resultsetname)]
 %REPORT [(resultsetname)] {
  ...
 %}
%}

例如:

%FUNCTION (DTW_SQL) mystoredproc () {
     CALL  myproc   
%REPORT {
      ...
      %ROW {  ...   %}
      ...  
 %} 
%}

另外,也可以使用下列語法︰

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure (resultsetname) 
 
 %REPORT (resultsetname) {
  ...
 %}
%}

例如:

%FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc (mytable1)  
 %REPORT (mytable1) {
  ...      
  %ROW {  ...   %}
  ...  
 %} 
%}

若要將單一結果集儲存在 Net.Data 表格做進一步處理︰

請使用下列語法︰

%FUNCTION (DTW_SQL) function_name (OUT tablename) {
   CALL stored_procedure (resultsetname) 
%}

例如:

%DEFINE DTW_DEFAULT_REPORT = "NO"  
 
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
   CALL myproc (mytable1) 
%}

請注意,DTW_DEFAULT_REPORT 是設為 NO, 這樣就不會為結果集建立預設報表。

若要傳回多重結果集並使用預設報表格式來顯示︰

請使用下列語法︰

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure [(resultsetname1, resultsetname2, ...)]
%}

其中未指定任何報表區塊。

例如:

%DEFINE DTW_DEFAULT_REPORT = "YES"
%FUNCTION (DTW_SQL) mystoredproc () {
     CALL  myproc
%}

若要傳回多重結果集, 並要將結果集儲存在 Net.Data 表格中做進一步處理︰

請使用下列語法︰

 %FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) {
    CALL stored_procedure (resultsetname1, resultsetname2, ...) 
%}

例如:

%DEFINE DTW_DEFAULT_REPORT = "NO"  
 
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
     CALL myproc (mytable1, mytable2) 
%}

請注意,DTW_DEFAULT_REPORT 是設為 NO, 這樣就不會為結果集建立預設報表。

若要傳回多重結果集,並指定 REPORT 區塊以處理顯示方式︰

每一個結果集結合一個或多個 REPORT 區塊。請使用下列語法︰

%FUNCTION (DTW_SQL) function_name (, ...) { 
   CALL stored_procedure (resultsetname1, resultsetname2, ...)
 %REPORT (tablename1) 
   ...      
   %ROW {  ...   %}   
   ...   
 %}    
 %REPORT (tablename2)       
   ...      
   %ROW {  ...   %} 
   ...   
 %} 
 
...
%}

例如:

%FUNCTION (DTW_SQL) mystoredproc () {  
   CALL myproc (mytable1, mytable2)   
 
 %REPORT(mytable1) {     
  ...    
  %ROW {  ...   %}     
  ...  
 %}   
 
 %REPORT(mytable2) {     
  ...     
  %ROW {  ...   %}     
  ...  
 %} 
%}

若要傳回多重結果集, 並為每一個結果集指定不同的顯示或處理選項︰

透過唯一的參數名稱,您可以為每一個結果集指定不同的處理選項。例如:

%FUNCTION (DTW_SQL) mystoredproc (OUT mytable2) {
    CALL myproc (mytable1, mytable2, mytable3)   
 
 %REPORT(mytable1)      
 ...     
 %ROW {  ...   %}      
 ...   
 %} 
%}
結果集 mytable1 由對應的 REPORT 區塊所處理, 並依據巨集寫出器的指定顯示出來。 結果集 mytable2 是儲存在 Net.Data 表格中 mytable2,現在可用於進一步處理,例如傳到其它函數。 由於沒有為結果集 mytable3 指定任何 REPORT 區塊, 所以用 Net.Data 預設報表格式顯示此結果集。

編碼結果集合中的 DataLink URL

DataLink 資料類型是擴充可儲存在資料庫檔案之資料類型的基本建置區塊之一。透過 DataLink,儲存在直欄中的真正資料僅是檔案的指標。 這個檔案可以是任一檔案類型;影像檔、聲音記錄檔或文字檔。 DataLinks 會儲存一個 URL,來解析檔案的位置。

DATALINK 資料類型需要使用「DataLink 檔案管理程式」。 「DataLink 檔案管理程式」的詳細資訊,請參閱您的作業系統的 DataLink 文件。 在您使用 DATALINK 資料類型之前,您必須確定 Web 伺服器有權存取「DB2 檔案管理程式伺服器」管理的檔案系統。

當 SQL 查詢透過 DataLink 來傳回結果集合,且 DataLink 直欄是以具有 READ PERMISSION DB DataLink 選項的 FILE LINK CONTROL 來建立時,DataLink 直欄中的檔案路徑將含有存取符記。 DB2 會使用這個存取符記,來鑑定檔案的存取權。沒有這個存取符記, 所有存取檔案的嘗試將因違反權限而失敗。不過,存取符記可能含有在將傳回給瀏覽器的 URL 中無法使用的字元,如分號 (;) 字元。 例如:

/datalink/pics/UN1B;0YPVKGG346KEBE;baibien.jpg
 

URL 無效,因為它含有分號 (;) 字元。若要使得 URL 有效, 則必須使用 Net.Data 內建函數 DTW_URLESCSEQ 來編碼分號。不過, 在引用這個函數之前,必須先執行某些字串操作,因為這個函數也會編碼斜線 (/)。

您可以撰寫 Net.Data MACRO_FUNCTION,使字串操作自動化, 並使用 DTW_URLESCSEQ 函數。請在每一個從 DATALINK 資料類型直欄取回資料的巨集中使用這個技術。

範例 1:自動編碼從 DB2 UDB 傳回的 URL 的 MACRO_FUNCTION

%{ 執行:將 DTW_URLESCSEQ 引用到 DATALINK URL,使它成為有效的 URL。
    輸入:來自 DB2 檔案管理程式直欄的 DATALINK URL。
    傳回:具有符記部份的 URL 是已編碼的 URL
%}
%MACRO_FUNCTION encodeDataLink(in DLURL) {                        
  @DTW_rCONCAT( @DTW_rDELSTR( DLURL, 
  @DTW_rADD(@DTW_rLASTPOS("/", DLURL), "1" ) ),
  @DTW_rURLESCSEQ( @DTW_rSUBSTR(DLURL,
  @DTW_rADD( @DTW_rLASTPOS("/", DLURL), "1" ) ) ) )
%}

在使用這個 MACRO_FUNCTION 後,已適當編碼了 URL, 且可以在 Web 瀏覽器上參照 DATALINK 直欄中指定的檔案。

範例 2:指定將傳回 DATALINK URL 的 SQL 查詢的 Net.Data 巨集

    
 %FUNCTION(DTW_SQL) myQuery(){
  select name, DLURLCOMPLETE(picture) from myTable where name like '%river%'
%REPORT{ 
%ROW{ 
      <p> $(V1) <br /> 
      Before Encoding: $(V2) <br /> 
      After Encoding: @encodeDataLInk($(V2)) <br /> 
      Make HREF: <a href="@encodeDataLink($(V2))"> click here </a> <br /> <p> 
    %}
  %}
%}

請注意,將使用「DataLink 檔案管理程式」函數。 這個函數 dlurlcomplete 會傳回完整的 URL。

關聯式資料庫語言環境範例

下列範例顯示您可以如何從巨集中呼叫關聯式資料庫語言環境:

ODBC

下列範例定義及呼叫 ODBC 語言環境的多個函數:

%DEFINE {
   DATABASE="qesq1"
   SHOWSQL="YES"
   table="int_null"
   LOGIN="netdata1"
   PASSWORD="ibmdb2"%}
%function(dtw_odbc) sq1() {
create table int_null (int1 int, int2 int)
%}
%function(dtw_odbc) sql2() {
insert into $(table) (int1) values (111)
%}
%function(dtw_odbc) sql3() {
insert into $(table) (int2) values (222)
%}
%function(dtw_odbc) sql4() {
select * from $(table)
%}
%function(dtw_odbc) sql5() {
drop table $(table)
%}
%HTML(REPORT){
@sql1()
@sql2()
@sql3()
@sql4()
%}

Oracle
下列範例顯示一個具有 DTW_ORA 函數定義的巨集,它會查詢 Oracle 資料庫 udatabase,並使用變數參照來決定將查詢的資料庫表格。 FUNCTION 區塊也含有可處理錯誤狀況的 MESSAGE 區塊。當 Net.Data 處理巨集時, 它會在瀏覽器中顯示一個預設報表。

%DEFINE {
   LOGIN="ulogin"
   PASSWORD="upassword"
   DATABASE=""
   table= "utable"
%}
%FUNCTION(DTW_ORA) myQuery(){
select ename,job,empno,hiredate,sal,deptno from $(table) order by ename
%}
%MESSAGE{
100 : "<b>WARNING</b>: No employee were found that met your search criteria.<p>"
    : continue
%}
%HTML(REPORT){
@myQuery()
%}

SQL

下列範例顯示一個具有可呼叫 SQL 儲存程序的 DTW_SQL 函數定義的巨集。 它具有三種不同資料類型的參數。 DTW_SQL 語言環境會將每一個參數傳遞到符合參數的資料類型的儲存程序。當儲存程序完成處理後,將傳回輸出參數,且 Net.Data 會相應地更新變數。

%{***********************************************************
                    定義區塊
************************************************************%}
%DEFINE {
 MACRO_NAME     = "TEST ALL TYPES"
  DTW_HTML_TABLE      = "YES"
 Procedure      = "TESTTYPE"
 parm1          = "1"              %{SMALLINT     	%}
 parm2          = "11"             %{INT    		    %}
 parm3          = "1.1"            %{DECIMAL (2,1) 	%}
 %}
 %FUNCTION(DTW_SQL)   myProc
  (INOUT SMALLINT    		parm1,
   INOUT INT       	   	parm2,
   INOUT DECIMAL(2,1)   	parm3){
CALL $(Procedure)
%}
%HTML(REPORT){
 <head>
<title>Net.Data : SQL 儲存程序︰範例 '$(MACRO_NAME)'。</title>
</head>
<body bgcolor="#bbffff" text="#000000" link="#000000">
<p><p>
呼叫將建立儲存程序的函數。
<p><p>
 @CRTPROC()
<hr>
<h2>
在呼叫儲存程序前 INOUT 參數的值:<p>
</h2>
<b>parm1  (SMALLINT)</b><br />
$(parm1)<p>
<b>parm2  (INT)</b><br />
$(parm2)<p>
<b>parm3  (DECIMAL)</b><br />
$(parm3)<p>
<p>
<hr>
<h2>
呼叫執行儲存程序的函數。
</h2>
<p><p>
 @myProc(parm1,parm2,parm3)
<hr>
<h2>
在呼叫儲存程序後 INOUT 參數的值:<p>
</h2>
<b>parm1  (SMALLINT)</b><br />
$(parm1)<p>
<b>parm2  (INT)</b><br />
$(parm2)<p>
<b>parm3  (DECIMAL)</b><br />
$(parm3)<p>
  </body>
%}


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