看板 HCHS_BioClub 關於我們 聯絡資訊
http://www.ascc.sinica.edu.tw/nl/85/1212/03.txt 《資料處理》 DB2使用簡介(下)(作者:吳和弟) 命令行處理器(Command Line Processor;CLP) 使用者可以利用命令行處理器來執行 DB2 指令與 SQL 敘述。有 三種方式使用命令行處理器: ‧交談式輸入模式 ‧作業系統命令提示(prompt)符號下的輸入模式 ‧從檔案輸入 1.交談式輸入模式 在作業系統命令提示符號下輸入"db2" 即可進入交談式輸入模式, 此時螢幕會出現"db2="提示符號。進入交談式輸入模式之後,畫面 的顯示如下: (c) Copyright IBM Corporation 1993,1995 Command Line Processor for DB2 SDK 2.1.0 You can issue database manager commands and SQL statements from the command prompt. For example: db2 => connect to sample db2 => bind sample.bnd For general help, type: ?. For command help, type: ? command, where command can be the first few keywords of a database manager command. For example: ? CATALOG DATABASE for help on the CATALOG DATABASE command ? CATALOG     for help on all of the CATALOG commands. To exit db2 interactive mode, type QUIT at the command prompt. Outside interactive mode, all commands must be prefixed with 'db2'. To list the current command option settings, type LIST COMMAND OPTIONS. For more detailed help, refer to the Online Reference Manual. db2 => 見到 "db2 ="的提示符號,就可知目前在命令行處理器的交談式輸 入模式。此時可直接輸入 DB2 指令或 SQL 敘述,而不需要在它們 之前加上 db2。例如: db2 = connect to stores db2 = select fname, lname, phone from customer db2 = connect reset 上面的第一個敘述執行連結到資料庫"stores"。第二個敘述執行 從表格"customer"裡面選取"fname"、"lname"、"phone" 三個欄位 的全部資料。第三個敘述執行不與資料庫連結,也就是與資料庫 ``stores'' 從連結狀態變成不連結狀態。 輸入"?"會把全部的 DB2 指令顯示出來,但是並不顯示 SQL 敘述 ,它相當於一般軟體常用的 HELP。例如: db2 => ? 結果如下: db2-command:  ATTACH FORCE APPLICATION PREP/PRECOMPILE  ATTACH TO GET AUTHORIZATIONS PRUNE HISTORY  BACKUP DATABASE GET CONNECTION STATE QUERY CLIENT  BIND GET INSTANCE QUIESCE TABLESPACES  CATALOG APPC NODE GET MONITOR SWITCHES QUIT  CATALOG DATABASE GET SNAPSHOT REBIND  CATALOG DCS DATABASE GET/RESET/UPDATE DB CFG REGISTER  CATALOG GLOBAL DATABASE GET/RESET/UPDATE DBM CFG RELEASE  CATALOG IPXSPX NODE HELP REORG TABLE  CATALOG LOCAL NODE IMPORT REORGCHK  CATALOG NETBIOS NODE INVOKE RESET MONITOR  CATALOG TCPIP NODE LIST APPLICATIONS RESTART DATABASE  CHANGE DATABASE COMMENT LIST BACKUP/HISTORY RESTORE DATABASE  CHANGE SQLISL LIST COMMAND OPTIONS ROLLFORWARD DATABASE  CONNECT LIST DATABASE DIRECTORY RUNSTATS  CONNECT RESET LIST DCS APPLICATIONS SET CLIENT  CONNECT TO LIST DCS DIRECTORY SET CONNECTION  CREATE DATABASE LIST INDOUBT TRANSACTIONS TERMINATE  DB2START/DB2STOP LIST NODE DIRECTORY UNCATALOG DATABASE  DEREGISTER LIST PACKAGES/TABLES UNCATALOG DCS DATABASE  DETACH LIST TABLESPACE CONTAINERS UNCATALOG NODE  DISCONNECT LIST TABLESPACES UPDATE COMMAND OPTIONS  DROP DATABASE LOAD UPDATE HISTORY  ECHO LOAD QUERY UPDATE MONITOR SWITCHES  EXPORT MIGRATE DATABASE Note: Some commands are operating system specific and may not be available. For further help: ? db2-command - help for specified command ? OPTIONS - help for all command options ? HELP - help for reading help screens. 輸入"?db2-command"會列出 DB2 指令的格式。此處的db2-command 可以是前面幾個關鍵字(keyword),如果有多個 DB2 指令都是以這 些關鍵字作開頭,則多個 DB2 指令的格式會被列出。如果僅有一 個 DB2 指令符合要查詢的關鍵字開頭,則僅有這個 DB2 指令的格 式會被列出。例如: db2 = ? connect 結果如下: CONNECT [USER username [USING password]] CONNECT RESET CONNECT TO database-alias [IN {SHARE|EXCLUSIVE} MODE] [USER username [USING password]] 例如: db2 = ? connect to 結果如下: CONNECT TO database-alias [IN {SHARE|EXCLUSIVE} MODE] [USER username [USING password]] 輸入"quit"或"terminate" 可跳出交談式輸入模式而回到作業系統 的命令提示符號下面。例如: db2 = quit 或 db2 = terminate "quit"與 "terminate"皆可跳出交談式輸入模式,但是兩者之間是 有差異的。"quit"並不會打斷資料庫的連結,也就是跳出後仍然在 資料庫的連結狀態。"terminate" 會打斷資料庫的連結,也就是跳 出後已不與任何資料庫連結。 2.作業系統命令提示(prompt)符號下的輸入模式 使用者可以在作業系統命令提示符號下面,利用命令行處理器來執 行DB2指令與SQL敘述。使用的方式是在 DB2 指令與 SQL 敘述之前 加上"db2"。例如: % db2 connect to stores % db2 select fname, lname, phone from customer % db2 connect reset 其中 % 是 c shell 的提示符號。 可在 DB2 指令與 SQL 敘述的前後兩端加上雙引號 (") 或單引號 ('),如此可避免作業系統下面的 shell 對 DB2 指令與 SQL 敘述 之內容的某些字元作處理。例如: % db2 "connect to stores" % db2 "select count(*) from customer" % db2 "connect reset" 上面的三個敘述會算出資料庫"stores"的表格"customer"所擁有的 記錄(record)總筆數。 3.從檔案輸入 要執行的 DB2 指令與 SQL 敘述可以先儲存在檔案裡面,然後利用 命令行處理器來執行檔案的內容。在作業系統命令提示符號下面, 要執行檔案內容的常用語法為: db2 -svtf filename 檔案裡面是以分號 (;) 當作一個 DB2 指令或 SQL敘述的結束。註 解(comment)的開始符號"--"必須位在一行(line)的第一個非空 白字元,一行裡面"--"後面的內容並不作處理。執行檔案的內容 時,會顯示每一個被執行的指令或敘述,遇到錯誤時會停止執行且 跳出。檔案裡面的每一個指令或敘述不需要以"db2"作開頭。 現在舉一個例子,檔案"test.sql"的內容如下: -- Testing SQL connect to stores; select fname, lname, phone from customer; connect reset; -- End db2 terminate; 要使用命令行處理器執行檔案"test.sql" 的內容,在作業系統命 令提示符號下面執行下述指令: db2 -svtf test.sql 發展應用程式 1.概念 使用者可以用下述的方式之任何一種來發展應用程式對 DB2 資料 庫作存取: ‧嵌入 SQL (Embedded SQL) 在第三代語言裡面。 ‧使用 DB2 所提供的應用程式介面 (Application Program Interface ;API)。 ‧使用DB2所提供呼叫層介面 (Call Level Interface ;CLI) 。 ‧在 client 端使用 ODBC (Open DataBase Connectivity) 寫應 用程式。 嵌入 SQL (Embedded SQL) 在第三代語言裡面是常被使用的方式, 它是把 SQL 敘述放在第三代語言裡面。整個應用程式的架構仍是 以所使用的第三代語言為主,只有在作資料庫的存取時,才會把 SQL 敘述放在第三代語言裡面。此種方式的優點為程式設計師可以 使用原本就熟悉的第三代語言,而縮短訓練的時間;缺點是程式比 第四代語言難寫且不好維護。 DB2 支援可嵌入 SQL 的第三代語言有:C、FORTRAN、COBOL。含有 SQL 的第三代語言之原始程式檔案 (source file),它們的副檔名 (extension) 如下: C     .sqc FORTRAN  .sqf COBOL   .sqb 本文以在 C 語言裡面嵌入 SQL 為例子作說明。 2.範例 下面是一個 C 語言裡面嵌入 SQL 的例子,這個程式執行的動作 是從資料庫"stores"的表格"customer"裡面選取每一筆記錄 (record) 的fname、lname、city、state 欄位,並顯示出來。檔案 "test1.sqc"的內容如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sqlenv.h> 4 5 EXEC SQL include sqlca; 6 7 8 EXEC SQL BEGIN DECLARE SECTION; 9 char aFname[16]; 10 char aLname[16]; 11 char aCity [16]; 12 char aState[3]; 13 EXEC SQL END DECLARE SECTION; 14 15 16 void main() 17 { 18 EXEC SQL connect to stores; 19 if (sqlca.sqlcode != 0) { 20 printf("CONNECT TO Error: sqlca.sqlcode = %ld\n", 21 sqlca.sqlcode); 22 exit(1); 23 } 24 25 EXEC SQL declare democursor cursor for 26 select fname, lname, city, state from customer; 27 28 EXEC SQL open democursor; 29 30 for ( ; ; ) { 31 EXEC SQL fetch democursor into :aFname, :aLname, 32 :aCity, :aState; 33 if (sqlca.sqlcode != 0) 34 break; 35 printf("%15s %15s %15s 2s\n", aFname, aLname, 36 aCity, aState); 37 } 38 39 EXEC SQL close democursor; 40 41 EXEC SQL connect reset; 42 if (sqlca.sqlcode != 0) { 43 printf("CONNECT RESET Error: sqlca.sqlcode = %ld\n", 44 sqlca.sqlcode); 45 exit(1); 46 } 47 48 printf("Program Over.\n"); 49 } 現在對程式 "test1.sqc"作簡單的介紹。在 C 裡面要加入 SQL 敘述,必須在每個 SQL 敘述之前加上 "EXEC SQL"。 第 3 行會引入 sqlenv.h 這個 header file,它定義了 SQL 的 一些環境。 第 5 行定義 structure sqlca,主要作為 SQL 通訊之用,每執 行一個 SQL 敘述,structure sqlca 裡面的元素 sqlcode 會反應 SQL 敘述執行是否正確。如果執行正確則 sqlcode 為 0,否則不為 0 而為 error code,可根據 error code 找出錯誤的原因。 第 8 行與第 13 行分別表示 host 變數宣告的開頭與結束,所以 aFname、aLname、aCity、aState 皆是 host 變數。 host 變數是 C 語言的變數,用於把資料送進資料庫或是從資料庫抓資料。在 SQL 敘述裡面用到 host 變數,必須在 host 變數之前加上冒號 (:)。 第 18 行執行連結資料庫"stores"。 第 19 行判斷連結資料庫"stores" 的動作是否成功,如果成功則 sqlca.sqlcode 會是 0,如果失敗則 sqlca.sqlcode 不為 0。 第 20 行至第 22 行是連結資料庫"stores"失敗時要作的動作。 第 25 行與第 26 行是宣告一個名為 democursor 的游標,它會 選取表格"customer"的 fname、lname、city、state 欄位之資料 第 28 行會開啟名為 democursor 的游標。 第 30 行至第 37 行是把每筆記錄 (record) 的 fname、 lname 、city、state 欄位之內容分別放入 host 變數 aFname、 aLname 、aCity、aState,且把這些欄位內容顯示出來。 第 39 行會關閉名為 democursor 的游標。 第 41 行執行打斷與資料庫"stores"的連結。 第 42 行判斷打斷與資料庫 "stores" 的連結之動作是否成功, 如果成功則 sqlca.sqlcode 會是 0,如果失敗則 sqlca.sqlcode 不為 0。 第 43 行至第 45 行是打斷與資料庫"stores" 的連結失敗時要作 的動作。 3.步驟 建立一個 C 語言裡面嵌入 SQL 的應用程式之步驟如下: (a)編寫正確的原始程式檔案 (source file),它們的副檔名 (extension) 是 .sqc。內容以 C 語言的格式為主要架構,加入 SQL 敘述。例如:前面所提到的檔案 test1.sqc。 (b)連結要用到的資料庫。例如: db2 connect to stores (c)把 .sqc 檔案先編譯 (precompile) 成 .c 檔案,且產生 bind file (test1.bnd)。bind file 主要在達成最佳化 (optimize)。例如: db2 prep test1.sqc bindfile (d)Bind 到資料庫,把 bind file 的內容綁到資料庫裡面。例如 : db2 bind test1.bnd (e)打斷與資料庫的連結。例如: db2 connect reset (f)編譯 (compile) .c 檔案成為 object 檔案 (.o 檔案)。例如 : cc -c -O -I/sec2/dore2/hdwu/sqllib/include test1.c 其中 /sec2/dore2/hdwu 是資料庫管理實體(instance) 的擁有者 (owner) 之 home directory。 (g)執行 link 產生執行檔。例如: cc -O -L/sec2/dore2/hdwu/sqllib/lib test1.o -o test1 -ldb2 綜合上面的步驟,可在作業系統下面執行下述命令: db2 connect to stores db2 prep test1.sqc bindfile db2 bind test1.bnd db2 connect reset cc -c -O -I/sec2/dore2/hdwu/sqllib/include test1.c cc -O -L/sec2/dore2/hdwu/sqllib/lib test1.o -o test1 -ldb2 上面的過程也可以使用 makefile 的方式來達成,也就是根據 makefile 的撰寫規則,寫在檔案 "makefile"裡。然後在作業系統 下面執行命令 make,就會根據各個步驟執行,最後產生執行檔。 檔名為"makefile"的檔案內容舉例如下: DB2 = db2 CC = cc CFLAGS = -O IP1 = /sec2/dore2/hdwu/sqllib/include LP1 = /sec2/dore2/hdwu/sqllib/lib LIB1 = db2 DATABASE = stores EXE = test1 SQC = test1.sqc C = test1.c BND = test1.bnd OBJ = test1.o all : $(EXE) $(EXE) : $(OBJ) $(CC) $(CFLAGS) -L$(LP1) $(OBJ) -o $@ -l$(LIB1) $(OBJ) : $(C) $(CC) -c $(CFLAGS) -I$(IP1) $(C) $(C) $(BND) : $(SQC) $(DB2) connect to $(DATABASE); \ $(DB2) prep $(SQC) bindfile; \ $(DB2) bind $(BND); \ $(DB2) connect reset clean : rm $(C) $(BND) $(OBJ) $(EXE) 結語 從前一聽到 DB2,就立刻讓人聯想到必須裝設在 IBM 的大型專屬 主機,且價格高不可攀。近幾年 IBM 致力於 DB2 跨平台能力的改 進,DB2 已被移植至多種小型機器,包括個人電腦及工作站,以順 應"小型化" 的世界潮流。IBM 為擴大 DB2 的市場佔有率,已把 DB2 的售價降到非常低,DB2 的價格遠比其它廠牌的關聯式資料庫 管理系統便宜。 DB2 到目前為止,一直保持著高穩定性與高效率的優良傳統。DB2 如果能在使用者操作介面的親和性方面加以改良,必定如虎添翼而 大放異彩。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.189.157