指令行處理器特性

本節提供指令行處理器特性的相關資訊。

指令行處理器 的運作方式如下:
  • 在命令提示字元中鍵入 CLP 指令 (在任一情況下)。
  • 按 ENTER 鍵將指令傳送至指令 Shell。
  • 輸出會自動導向標準輸出裝置。
  • 支援管線和重新導向。
  • 系統會通知使用者完成成功及不成功。
  • 執行指令之後,控制權會回到作業系統命令提示字元,使用者可以輸入更多指令。
  • 使用檔案輸入選項呼叫 CLP 時,它會自動將 CLIENT APPLNAME 特別暫存器設為 CLP filename
您可以透過下列任一方式啟動指令行處理器:
  • 鍵入 db2 指令,或
  • 在 Linux® 作業系統上,按一下 主功能表 ,然後選取 IBM Db2 > 指令行處理器
某些 CLP 指令及 SQL 陳述式需要伺服器實例正在執行中,且存在資料庫連線。 執行下列其中一個動作,以連接至資料庫:
  • 發出 SQL 陳述式:
    db2 connect to database
  • 建立與 Db2® 登錄變數 DB2DBDFT所定義預設資料庫的隱含連線。

如果指令超出命令提示字元所容許的字元限制,則可以使用反斜線 (\) 作為行接續字元。 當 指令行處理器 發現續行字元時,它會讀取下一行,並連結兩行所包含的字元。 或者, -t 選項可用來設定不同的行終止字元。

指令行處理器 會將稱為 NULL 的字串辨識為空字串。 先前設定為某個值的欄位稍後可以設定為空值。 例如,
   db2 update database manager configuration using tm_database NULL
tm_database 欄位設為 NULL。 此作業區分大小寫。 小寫 null 不會解譯為空字串,而是解譯為包含字母 null的字串。

自訂指令行處理器

可以使用 DB2_CLPPROMPT 登錄變數來自訂互動式輸入提示。 此登錄變數可以設為長度上限為 100 的任何字串,且可以包含記號 %i、 %ia、 %d、 %da 及 %n。 在執行時期,會以特定值來替代這些記號。

表 1. DB2_CLPPROMPT 記號和執行時期值
DB2_CLPPROMPT 記號 執行時期的值
%ia 現行實例連接的授權 ID
%i 目前連接實例的本端別名。 如果不存在實例連接,則為 DB2INSTANCE 登錄變數的值。 僅在 Windows 平台上,如果未設定 DB2INSTANCE 登錄變數,則為 DB2INSTDEF 登錄變數的值。
%da 現行資料庫連線的授權 ID
%d 目前所連接資料庫的本端別名。 如果不存在資料庫連線,則為 DB2DBDFT 登錄變數的值。
%n 換行
  • 如果任何記號在執行時期沒有相關聯的值,則會以空字串來替代該記號。
  • 互動式輸入提示一律以大寫呈現授權 ID、資料庫名稱及實例名稱,以便與提示所顯示的連線及附件資訊一致。
  • 如果在 CLP 互動模式內變更 DB2_CLPPROMPT 登錄變數,則在 CLP 互動模式關閉並重新開啟之前, DB2_CLPPROMPT 的新值將不會生效。

您可以使用 DB2_CLPHISTSIZE 登錄變數來指定要儲存在指令歷程中的指令數。 HISTORY 指令可讓您存取在 CLP 互動模式階段作業內執行的指令歷程內容。

您也可以使用 DB2_CLP_EDITOR 登錄變數來指定在發出 EDIT 指令時所開啟的編輯器。 從 CLP 互動式階段作業中, EDIT 指令會開啟預載使用者指定指令的編輯器,然後可以編輯並執行該指令。

範例

如果 DB2_CLPPROMPT 定義為 (%ia @%i, %da @%d),則輸入提示將具有下列值:

  • 沒有實例連接,也沒有資料庫連線。 DB2INSTANCE 設為 DB2。 未設定 DB2DBDFT
    (@DB2, @)
  • (Windows) 沒有實例連接及資料庫連線。 未設定 DB2INSTANCEDB2DBDFTDB2INSTDEF 設為 DB2
    (@DB2, @)
  • 沒有實例連接,也沒有資料庫連線。 DB2INSTANCE 設為 DB2DB2DBDFT 設為 "SAMPLE"。
    (@DB2, @SAMPLE)
  • 實例連接至授權 ID 為 "keon14" 的實例 "Db2"。 DB2INSTANCE 設為 DB2DB2DBDFT 設為 "SAMPLE"。
    (KEON14@DB2, @SAMPLE)
  • 資料庫連線至授權 ID 為 "horton7" 的資料庫 "sample"。 DB2INSTANCE 設為 DB2DB2DBDFT 設為 SAMPLE
    (@DB2, HORTON7@SAMPLE)
  • 實例連接至授權 ID 為 "keon14" 的實例 "Db2"。 資料庫連線至授權 ID 為 "horton7" 的資料庫 "sample"。 DB2INSTANCE 設為 DB2。 未設定 DB2DBDFT
    (KEON14@DB2, HORTON7@SAMPLE)

在指令檔中使用指令行處理器

資料庫管理程式 的 CLP 要求可以內嵌在 Shell Script 指令檔中。 下列範例顯示如何在 Shell Script 指令檔中輸入 CREATE TABLE 陳述式:
   db2 "create table mytable (name VARCHAR(20), color CHAR(10))"

如需指令及指令檔的相關資訊,請參閱適當的作業系統手冊。

指令行處理器設計

指令行處理器 由兩個處理程序組成: 作為使用者介面的前端處理程序 ( Db2 指令) ,以及維護資料庫連線的後端處理程序 (db2bp)。

維護資料庫連線

每次呼叫 db2 時,都會啟動新的前端處理程序。 後端程序由第一次 db2 呼叫啟動,並且可以使用 TERMINATE明確地終止。 具有相同母項的所有前端處理程序都由單一後端處理程序提供服務,因此共用單一資料庫連線。

例如,來自相同作業系統命令提示字元的下列 db2 呼叫會導致個別前端處理程序共用單一後端處理程序,其在整個期間保留資料庫連線:
  • db2 'connect to sample',
  • db2 'select * from org',
  • . test01 (其中 test01 是包含 Db2 指令的 Shell Script) ,以及
  • db2 -tf myfile.clp
下列來自相同作業系統提示的呼叫會導致個別的資料庫連線,因為每一個都有不同的母項處理程序,因此有不同的後端處理程序:
  • test01
  • . test01 &
  • test01 &
  • sh test01
前端與後端處理程序之間的通訊

前端處理程序及後端處理程序透過三個訊息佇列進行通訊: 要求佇列、輸入佇列及輸出佇列。

環境變數

下列環境變數提供一種方法來配置兩個程序之間的通訊:

表 2. 環境變數
變數 最小值(U) 最大值 預設值
DB2BQTIME 1 5294967295 1
DB2BQTRY 0 次嘗試 5294967295 60 次嘗試
DB2RQTIME 1 5294967295 5
DB2IQTIME 1 5294967295 5
DB2BQTIME
當呼叫 指令行處理器 時,前端處理程序會檢查後端處理程序是否已在作用中。 如果它處於作用中,則前端處理程序會重新建立與它的連線。 如果它不在作用中,則前端處理程序會啟動它。 然後,前端系統處理程序會在 DB2BQTIME 變數指定的期間閒置,並重新檢查。 前端處理程序會繼續檢查 DB2BQTRY 變數指定的次數,在此之後,如果後端處理程序仍處於非作用中狀態,則會逾時並傳回錯誤訊息。
DB2BQTRY
DB2BQTIME 變數一起使用,並指定前端處理程序嘗試判定後端處理程序是否處於作用中的次數。

在峰值期間可以增加 DB2BQTIMEDB2BQTRY 的值,以最佳化查詢時間。

DB2RQTIME
一旦啟動後端處理程序,它就會在其要求佇列上等待來自前端系統的要求。 它也會在從命令提示字元起始的要求之間等待要求佇列。

DB2RQTIME 變數指定後端處理程序等待前端處理程序發出要求的時間長度。 在此時間結束時,如果要求佇列上不存在任何要求,則後端處理程序會檢查前端處理程序的母項是否仍然存在,並在它不存在時自行終止。 否則,它會繼續在要求佇列上等待。

DB2IQTIME
當後端處理程序接收來自前端處理程序的要求時,它會將確認通知傳送至前端處理程序,指出它已準備好透過輸入佇列接收輸入。 然後後端處理程序會在其輸入佇列上等待。 當批次檔 (以 -f 選項指定) 執行時,以及當使用者處於互動模式時,它也會在輸入佇列上等待。

DB2IQTIME 變數指定後端處理程序在輸入佇列上等待前端處理程序傳遞指令的時間長度。 過了此時間之後,後端處理程序會檢查前端處理程序是否處於作用中狀態,並在前端處理程序不再存在時返回以在要求佇列上等待。 否則,後端處理程序會繼續等待前端處理程序的輸入。

若要檢視這些環境變數的值,請使用 LIST COMMAND OPTIONS

後端環境變數會繼承後端處理程序起始時前端處理程序所設定的值。 不過,如果前端環境變數已變更,則後端處理程序將不會繼承這些變更。 後端處理程序必須先終止,然後重新啟動 (透過發出 db2 指令) 以繼承變更的值。

下列實務範例提供後端處理程序必須終止的時間範例:

  1. 使用者 A 登入,發出部分 CLP 指令,然後登出而不發出 TERMINATE
  2. 使用者 B 使用相同的視窗登入。
  3. 當使用者 B 發出某些 CLP 指令時,它們會失敗,並顯示訊息 DB21016 (系統錯誤)。

當使用者 B 開始使用 CLP 時,使用者 A 所啟動的後端處理程序仍在作用中,因為使用者 B 前端處理程序 (從中發出指令的作業系統視窗) 的母項仍在作用中。 後端處理程序會嘗試處理使用者 B 發出的新指令; 不過,使用者 B 的前端處理程序沒有足夠權限來使用後端處理程序的訊息佇列,因為它需要建立該後端處理程序的使用者 A 的權限。 在使用者使用相同的作業系統視窗啟動新的 CLP 階段作業之前, CLP 階段作業必須以 TERMINATE 指令結束。 這會為每一個新使用者建立全新的後端處理程序,防止權限問題,並在新使用者的後端處理程序中設定正確的環境變數值 (例如 DB2INSTANCE)。

CLP 使用注意事項

可以從命令提示字元輸入大寫或小寫指令。 不過,必須輸入區分 Db2 大小寫的參數,且大小寫完全相同。 例如, CHANGE DATABASE COMMENT 指令 WITH 子句中的 comment-string 是區分大小寫的參數。

SQL 陳述式中容許有定界 ID。

Special characters, or metacharacters (such as $ & * ( ) ; < > ? \ ' ") are allowed within CLP commands. 如果在 CLP 互動模式或 CLP 批次輸入模式之外使用它們,則作業系統 Shell 會解譯這些字元。 如果 shell 不採取任何特殊動作,則需要引號或跳出字元。

例如,在 AIX® Korn Shell 環境內執行時,
   db2 select * from org where division > 'Eastern'
is interpreted as "select <the names of all files> from org where division". 結果 (SQL 語法錯誤) 會重新導向至檔案 Eastern。 下列語法會產生正確的輸出:
   db2 "select * from org where division > 'Eastern'"

不同平台的特殊字元各不相同。 在 AIX Korn shell 中,前一個範例可以使用跳出字元 (\) 來重新撰寫,例如 \ *、\> 或 \ '。

大部分作業系統環境容許重新導向輸入及輸出。 例如,如果已建立與 SAMPLE 資料庫的連線,則下列要求會查詢 STAVER 表格,並將輸出傳送至 mydata 目錄中名為 staflist.txt 的檔案:
   db2 "select * from staff" > mydata/staflist.txt
對於不支援輸出重新導向的環境,可以使用 CLP 選項。 例如,要求可以重新撰寫為
   db2 -r mydata\staflist.txt "select * from staff"
 
   db2 -z mydata\staflist.txt "select * from staff"
指令行處理器不是程式設計語言。 例如,它不支援主變數及陳述式,
   db2 connect to :HostVar in share mode
語法不正確,因為 :HostVar 不是有效的資料庫名稱。

指令行處理器 以連字號 (-) 代表 SQL NULL 值。 如果直欄是數值,則連字號會放置在直欄右側。 如果直欄不是數值,則連字號位於左側。

若要從 Db2 指令行處理器 視窗正確地顯示單位元組 (SBCS) 語言的國家字元,必須選取 True Type 字型。 例如,在 Windows 環境中,開啟指令視窗內容筆記本,並選取一個字型,例如 Lucinda Console。 列印不可列印的字元 (例如 bell (0x7)) 時不會進行替代,因此必須特別考量 ASCII 空值字元 (0x0)。 即使可接受在 VARCHAR 字串內具有 ASCII 空值字元 (0x0) ,字串的顯示仍會在字串內找到的第一個 ASCII 空值字元處結束。

例如,
db2 "insert into sample values (x'410041')"
db2 "insert into sample values (x'410741')"

db2 "select CHARACTER_LENGTH(DATA, OCTETS) LENGTH, 
            DATA, 
            hex(DATA) HEX_VALUE 
     from sample"

     LENGTH           DATA                       HEX_VALUE
----------- -------------------- ----------------------------------------
      3                A                         410041
      3                AA                        410741

指令行處理器在檔案路徑名稱中不支援國家語言支援 (NLS) 字元。 這尤其會影響指令 (例如 IMPORTEXPORTREGISTER XMLSCHEMA) ,其中最常發現有問題的檔案路徑名稱。

支援將指令行處理器指令的輸出傳送至另一個指令行處理器指令。 例如: db2 -x <SQL_statement> | db2 +p -tv。 此支援僅受管道緩衝區大小限制。 無法配置管線緩衝區大小。 如果第一個指令超出管道緩衝區大小,則在嘗試將輸出寫入管道緩衝區時,指令行處理器可能會當掉或失敗。 如果第二個指令不是指令行處理器指令 (例如 UNIX Shell 指令) ,則由於管道緩衝區大小限制,不會發生當掉或失敗。

指令行處理器 支援資料庫連線的 db2dsdriver.cfg 配置檔。 您可以搭配使用內嵌式 SQL 所支援的 db2dsdriver.cfg 關鍵字與 指令行處理器