2009 年 2 月 10 日
本文主要介紹如何使用 IBM Data Studio 開發(fā)數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程和 Data Web Services 。 IBM Data Studio 對(duì)數(shù)據(jù)庫(kù)開發(fā)提供了完備的支持,同時(shí)提供了把存儲(chǔ)過(guò)程發(fā)布成 Web Services 的工具。通過(guò)本文,讀者可以學(xué)習(xí)到如何安裝 IBM Data Studio,如何簡(jiǎn)單高效地開發(fā)和調(diào)試數(shù)據(jù)庫(kù)應(yīng)用程序以及如何把它們發(fā)布成 Web Services 。
IBM Data Studio 是一款免費(fèi)的基于 Eclipse 的用于數(shù)據(jù)庫(kù)開發(fā)的工具。 IBM Data Studio 包含了開發(fā)數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的所有功能,同時(shí)提供了對(duì) DB2 v9 的 XML 功能的支持。
本文將通過(guò)一個(gè)開發(fā)實(shí)例介紹 IBM Data Studio 是如何幫助我們進(jìn)行存儲(chǔ)過(guò)程開發(fā)的。
項(xiàng)目實(shí)例介紹
在開始使用 IBM Data Studio 之前,讓我們先來(lái)了解一下本文的項(xiàng)目實(shí)例。該項(xiàng)目實(shí)例是一個(gè)簡(jiǎn)化版的軟件開發(fā)管理系統(tǒng)。系統(tǒng)主要管理 User Story 和 Work Item 的信息。 User Story 就是以用戶的角度編寫的業(yè)務(wù)需求,是軟件需要實(shí)現(xiàn)的功能。我們需要記錄 User Story 的具體內(nèi)容和其狀態(tài)。這里的狀態(tài)是指該 User Story 是在草擬狀態(tài)還是完成狀態(tài)。 Work Item 用于記錄軟件開發(fā)的過(guò)程。 Work Item 可以是根據(jù)某個(gè) User Story 編寫的詳細(xì)設(shè)計(jì),也可以是一個(gè)編碼任務(wù),或者是一個(gè) bug 報(bào)告。我們需要記錄其狀態(tài)(未分配,處理中和完成等),結(jié)對(duì)編程人員的 Email 等信息。
本系統(tǒng)應(yīng)該實(shí)現(xiàn)如下功能 ( 未列出所有功能 ):
- 創(chuàng)建 User Story 。
- 修改 User Story 。
- 查詢所有草擬狀態(tài)的 User Story 。
- 創(chuàng)建 Work Item 。
- 修改 Work Item 。
- 查詢屬于某個(gè) User Story 的所有 Work Item 。
為此我們?cè)O(shè)計(jì)了相應(yīng)的數(shù)據(jù)庫(kù)表:USER_STORY 和 WORK_ITEM 。它們的詳細(xì)定義如下表所示:
圖 1. User story 和 Work item 的關(guān)系 表 1. User Story 的定義
USER_STORY
列名稱 |
類型 |
說(shuō)明 |
id |
INTEGER |
表主鍵。 |
author |
VARCHAR |
編寫人的 Email 地址。 |
status |
CHAR |
表示 User Story 的狀態(tài),可以是草擬,完成等值。 |
txt |
VARCHAR |
User Story 的具體內(nèi)容 |
表 2. Work Item 的定義
WORK_ITEM
列名稱 |
類型 |
說(shuō)明 |
id |
INTEGER |
表主鍵。 |
user_story_id |
INTEGER |
記錄該 Work Item 對(duì)應(yīng)的 User Story 。 |
type |
CHAR |
類型,分為:詳細(xì)設(shè)計(jì),編碼任務(wù),bug 報(bào)告。 |
status |
CHAR |
狀態(tài),分為: 未分配,處理中,完成等。 |
txt |
VARCHAR |
Work Item 的具體說(shuō)明。 |
primaryStaff |
VARCHAR |
首席工作人員 Email 地址 |
secondaryStaff |
VARCHAR |
結(jié)對(duì)的開發(fā)人員 Email 地址 |
為了實(shí)現(xiàn)系統(tǒng)的功能,我們還需要下列存儲(chǔ)過(guò)程 :
- I_USER_STORY: 創(chuàng)建 User Story 。
- U_USER_STORY: 修改 User Story 。
- S_INIT_STORY: 查詢所有草擬狀態(tài)的 User Story 。
- I_WORK_ITEM: 創(chuàng)建 Work Item 。
- U_WORK_ITEM: 修改 Work Item 。
- S_ITEM_OF_STORY: 查詢屬于某個(gè) User Story 的所有 Work Item 。
DB2 存儲(chǔ)過(guò)程開發(fā)
“工欲善其事,必先利其器”。現(xiàn)在我們明確了需求,為了開發(fā)出優(yōu)秀的軟件,我們還需要一個(gè)開發(fā)工具。 IBM Data Studio 就是一款非常好的存儲(chǔ)過(guò)程開發(fā)工具,我們可以從 IBM 官方網(wǎng)站上下載其安裝包。安裝完畢后啟動(dòng) IBM Data Studio,可以看到 IBM Data Studio 的界面主要由四個(gè)區(qū)域組成:
- Data Project Explorer中會(huì)列出所有的Data project。
- Data Explorer中會(huì)列出所有的數(shù)據(jù)庫(kù)連接。
- 工作區(qū)用于編輯 SQL 文件和存儲(chǔ)過(guò)程源文件。
- Data Output是結(jié)果輸出區(qū),在我們執(zhí)行 SQL 語(yǔ)句后,數(shù)據(jù)庫(kù)返回的結(jié)果會(huì)顯示在該區(qū)域。
圖 2. IBM Data Studio 的主要界面
創(chuàng)建數(shù)據(jù)庫(kù)項(xiàng)目
首先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接:
- 右鍵單擊Data Explorer中的Connections, 選擇New Connections...,
- 在新建數(shù)據(jù)庫(kù)連接向?qū)е校钊霐?shù)據(jù)庫(kù)的信息 : 數(shù)據(jù)庫(kù)地址,端口,用戶名和密碼等,
- 單擊Test Connection按鈕來(lái)測(cè)試數(shù)據(jù)庫(kù)連接是否正常,
- 單擊Finish按鈕后,一個(gè)新的數(shù)據(jù)庫(kù)連接就創(chuàng)建完畢。我們可以在Data Explorer中看到新建的數(shù)據(jù)庫(kù)連接 DRAG 。
圖 3. 新建數(shù)據(jù)庫(kù)連接
默認(rèn)情況下 IBM Data Studio 不會(huì)記錄連接數(shù)據(jù)庫(kù)的用戶密碼,為了避免每次連接數(shù)據(jù)庫(kù)時(shí)都輸入密碼,我們可以修改相應(yīng)設(shè)置,把數(shù)據(jù)庫(kù)的用戶和密碼存儲(chǔ)在電腦中:
- 從菜單上選擇Window > Preferences...,
- 在彈出窗口的左邊選定Data節(jié)點(diǎn),
- 把Password information設(shè)置為Persistence Scope。
圖 4. 修改密碼保存選項(xiàng)
接著,我們創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)項(xiàng)目。
- 右鍵單擊Data Project Explorer,在彈出菜單上選擇New > Data Development Project。
- 輸入項(xiàng)目名稱和 schema 名稱。這里我們輸入 Sample 作為項(xiàng)目的名稱,使用登錄用戶 ID 作為項(xiàng)目的 schema 。
- 選擇數(shù)據(jù)庫(kù)連接。您可以創(chuàng)建一個(gè)新連接,也可以使用已有的數(shù)據(jù)庫(kù)連接。這里我們選擇數(shù)據(jù)庫(kù) DRAG 。
- 點(diǎn)擊Finish,一個(gè) Data Development Project 就創(chuàng)建完畢了。
展開 Sample 項(xiàng)目,我們可以看到在項(xiàng)目的根目錄下有五個(gè)文件夾,分別用來(lái)存放 SQL 文件,存儲(chǔ)過(guò)程源文件,UDF 源文件,Web Service 文件和 XML 文件。
圖 5. 項(xiàng)目的結(jié)構(gòu)
開發(fā)數(shù)據(jù)庫(kù)對(duì)象
創(chuàng)建完項(xiàng)目,我們就可以開始開發(fā)數(shù)據(jù)庫(kù)對(duì)象了,也就是要編寫建表語(yǔ)句和存儲(chǔ)過(guò)程。為了規(guī)范我們編寫的代碼和提高我們編碼的效率,我們首先要設(shè)置一下模板。
在 IBM Data Studio 中可以很方便地定義 SQL 模板:
- 選擇菜單Window > Preferences。
- 在彈出的參數(shù)配置頁(yè)面的左側(cè),選擇Data > SQL Editor > Templates。
從下圖我們可以看到,IBM Data Studio 給我們提供了一些通用的模板。
圖 6. 通用模板
這里我們?cè)俣x一些我們項(xiàng)目中使用的模板。
- 點(diǎn)擊New...按鈕,IBM Data Studio 會(huì)彈出一個(gè)模板定義窗口。
- 輸入模板的名稱和內(nèi)容 (Pattern) 等。在定義模板內(nèi)容的時(shí)候,需要替換的部分我們稱為變量,變量可以使用 ${} 進(jìn)行定義,例如 ${expression} 。
下面是我們定義的模板的具體內(nèi)容:
清單 1. 創(chuàng)建表的模板
DROP TABLE ${table_name}
@
----------------------------------------------------------------------------------
--
-- Table_Name: ${table_name}
-- File Name: ${table_name}.SQL
-- Author: ${user}
-- Date: ${date}
--
-- Abstract:
--
--
-- MAINTENANCE LOG
-- who date comment
-- --- -------- ---------------------------------------------------------------
-----------------------------------------------------------------------------------
CREATE TABLE ${table_name}
(
)
@
--Primary Key
ALTER TABLE ${table_name}
ADD CONSTRAINT ${table_name}_PK
PRIMARY KEY (${pk} )
@
|
清單 2. 創(chuàng)建存儲(chǔ)過(guò)程的模板
DROP SPECIFIC PROCEDURE ${spName}
@
CREATE PROCEDURE ${spName} (
OUT poGenStatus INTEGER
, IN ${piArgu} VARCHAR(8)
)
SPECIFIC ${spName}
RESULT SETS 0
LANGUAGE SQL
------------------------------------------------------------------------------
--
-- Procedure Name : ${spName}
-- Specific Name: ${spName}
-- File Name: ${spName}.SQL
-- Author: ${user}
-- Date: ${date}
--
-- Abstract: ${description}
--
--
-- Sample Calls:
-- call ${spName} (?,'${piArgu}')
--
-- MAINTENANCE LOG
-- who date comment
-- --- -------- ------------------------------------------------------------
-- ${user} ${date} Initial version
--
-------------------------------------------------------------------------------
BEGIN NOT ATOMIC
-------------------------------------------------------------
-- Variables declarations
-------------------------------------------------------------
-- Generic Variables
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
-- Generic handler variables
DECLARE hSqlcode INTEGER DEFAULT 0;
DECLARE hSqlstate CHAR(5) DEFAULT '00000';
-- error variables
DECLARE ERR_MISSING_INPUT INTEGER DEFAULT 34100;
DECLARE ERR_GENERAL_SQL INTEGER DEFAULT 1;
DECLARE ERR_RECORD_EXISTS INTEGER DEFAULT 4;
DECLARE ERR_ROW_NOT_FOUND INTEGER DEFAULT 5000;
-- Local Variables
DECLARE vCurrentTimestamp TIMESTAMP;
-------------------------------------------------------------
-- CONDITION declaration
-------------------------------------------------------------
-- (80100~80199) SQLCODE & SQLSTATE
DECLARE sqlReset CONDITION FOR SQLSTATE '80100';
-------------------------------------------------------------
-- CURSOR declaration
-------------------------------------------------------------
-------------------------------------------------------------
-- EXCEPTION HANDLER declaration
-------------------------------------------------------------
-- Handy Handler
DECLARE CONTINUE HANDLER FOR sqlReset
BEGIN NOT ATOMIC
SET hSqlcode = 0;
SET hSqlstate = '00000';
SET poGenStatus = 0;
END;
-- Generic Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN NOT ATOMIC
-- Capture SQLCODE & SQLSTATE
SELECT SQLCODE, SQLSTATE
INTO hSqlcode, hSqlstate
FROM SYSIBM.SYSDUMMY1;
-- Use the poGenStatus variable to tell the procedure what type
-- of error occurred. In some cases, it can be assigned to the
-- poGenStatus variable to be returned to the client.
CASE hSqlstate
WHEN '02000' THEN --row not found
SET poGenStatus=5000;
WHEN '42724' THEN --missing llsp
SET poGenStatus=3;
ELSE
IF (hSqlCode < 0) THEN --trap only errors, not warnings
SET poGenStatus=2;
END IF;
END CASE;
END;
-------------------------------------------------------------
-- Initialization
-------------------------------------------------------------
-- reset all output parameters to NULL
SET poGenStatus = 0;
SET ${piArgu} = RTRIM(COALESCE(${piArgu}, ''));
--------------------
-- data validation
--------------------
IF (${piArgu} = '') THEN
SET poGenStatus = ERR_MISSING_INPUT;
RETURN poGenStatus;
END IF;
SET vCurrentTimestamp = CURRENT TIMESTAMP;
RETURN poGenStatus;
END
@
|
現(xiàn)在我們開始編寫代碼。右鍵單擊SQL Scripts文件夾,在彈出菜單中選擇New > SQL or Xquery Script。輸入名稱 USER_STORY,然后單擊Finish。在打開的 USER_STORY.SQL 中,單擊右鍵選擇Content Assist,然后選擇 create table 模板。模板的內(nèi)容被插入到文件中,需要修改的內(nèi)容被高亮顯示。我們依次修改表名和列的信息。在我們修改 SQL 文件的時(shí)候,IBM Data Studio 還在有語(yǔ)法錯(cuò)誤的語(yǔ)句下面顯示一條紅線,真是太棒了!
修改后的代碼如下:
清單 3. 建表語(yǔ)句
-- <ScriptOptions statementTerminator="@" />
DROP TABLE USER_STORY
@
----------------------------------------------------------------------------------
--
-- Table_Name: USER_STORY
-- File Name: USER_STORY.SQL
-- Author: will
-- Date: Sep 9, 2008
--
-- Abstract:
--
--
-- MAINTENANCE LOG
-- who date comment
-- --- -------- ---------------------------------------------------------------
-----------------------------------------------------------------------------------
CREATE TABLE USER_STORY
(
id INTEGER NOT NULL, -- 表主鍵。
author VARCHAR(80), -- 編寫人的 Email 地址。
status CHAR(10), -- 表示 User Story 的狀態(tài),可以是草擬,完成等值。
txt VARCHAR(500) --User Story 的具體內(nèi)容
)
@
--Primary Key
ALTER TABLE USER_STORY
ADD CONSTRAINT USER_STORY_PK
PRIMARY KEY (ID )
@
|
編寫完建表文件后,我們需要把它裝載到數(shù)據(jù)庫(kù)中。
由于我們?cè)?USER_STORY.SQL 文件中使用 @ 符號(hào)作為分隔符。所以,我們需要在 IBM Data Studio 中把 @ 指定成分隔符。在工作區(qū),單擊右鍵,在彈出菜單中選擇Set Statement Terminator,然后輸入 @ 。
下面,我們開始執(zhí)行我們編寫的 USER_STORY.SQL 文件。右鍵單擊工作區(qū),選擇Run SQL。我們可以在Data Output視圖中看到 Run successful 的消息。
我們來(lái)查詢一下 USER_STORY 表里數(shù)據(jù)。新建一個(gè) query.sql 文件。在 query.sql 文件里鍵入 SELECT * FROM, 這時(shí)我突然忘記了表的名字(有時(shí)候,因?yàn)楸砻L(zhǎng),我們很容易不記得其名字),IBM Data Studio 可以幫助我們找到我們想要的表。首先鍵入 U (我記得表是以 U 開頭的),然后單擊右鍵選擇Content Assist或者使用快捷鍵 Alt+/ 。哦,IBM Data Studio 把所有以 U 開頭的表都列在了彈出框里。我們選擇 USER_STORY 這個(gè)表。然后,我們象執(zhí)行 USER_STORY.SQL 一樣執(zhí)行該語(yǔ)句,可以在 Data Output 視圖中看到,目前表里沒(méi)有任何數(shù)據(jù)。
圖 7. Data Output 視圖
在Content Assist和模板的幫助下,我們很方便的完成了項(xiàng)目所需要的表和存儲(chǔ)過(guò)程。雖然 IBM Data Studio 也提供了創(chuàng)建存儲(chǔ)過(guò)程的向?qū)?,不過(guò)我更傾向于模板加手動(dòng)修改源文件的方式編寫存儲(chǔ)過(guò)程。您可以選擇您自己喜歡的方式去編寫存儲(chǔ)過(guò)程。
有時(shí)候,我們需要看一下數(shù)據(jù)庫(kù)中某個(gè)存儲(chǔ)過(guò)程的源代碼。我們可以在Database Explorer中,依次打開[database name]> Schemas > Stored Procedures。右鍵單擊存儲(chǔ)過(guò)程,在彈出菜單中選擇Open > With SQL Editor。然后存儲(chǔ)過(guò)程的源代碼就在 IBM Data Studio 中打開了。
圖 8. 打開源代碼
調(diào)試存儲(chǔ)過(guò)程
我們已經(jīng)編寫完所有的存儲(chǔ)過(guò)程了,測(cè)試人員正在對(duì)這些存儲(chǔ)過(guò)程進(jìn)行測(cè)試,初步結(jié)論是這些存儲(chǔ)過(guò)程運(yùn)行正常。我們非常高興,認(rèn)為開發(fā)工作應(yīng)該是完成了??墒钦?dāng)我們暗自高興的時(shí)候,測(cè)試人員來(lái)找我們了。他們說(shuō),新增 User Story 這塊功能突然出問(wèn)題了,這塊功能在前幾天的測(cè)試都是正常的。這就奇怪了,我們最近沒(méi)有更新過(guò)代碼,為什么原來(lái)可以使用的功能突然就不能用了呢? 大家一邊看著代碼,一邊皺眉---代碼應(yīng)該沒(méi)有問(wèn)題啊。
幸好,IBM Data Studio 為我們提供了非常優(yōu)秀的調(diào)試功能,我們可以像調(diào)試 Java 程序那樣調(diào)試存儲(chǔ)過(guò)程。 在 IBM Data Studio 中針對(duì)存儲(chǔ)過(guò)程設(shè)置斷點(diǎn),單步執(zhí)行,查看存儲(chǔ)過(guò)程運(yùn)行時(shí)的某些變量值都變得非常簡(jiǎn)單。
現(xiàn)在我們就開始調(diào)試出問(wèn)題的存儲(chǔ)過(guò)程 I_USER_STORY 。
- 在Data Project Explorer窗口中,右鍵單擊存儲(chǔ)過(guò)程 I_USER_STORY,選擇Deploy...,
- 在彈出的部署向?qū)ы?yè)上選中Enable Debuging選項(xiàng),點(diǎn)擊Finish,把 I_USER_SOTRY 部署到數(shù)據(jù)庫(kù)中,
- 使用 SQL 編輯器打開項(xiàng)目中的存儲(chǔ)過(guò)程,雙擊左側(cè)欄設(shè)置斷點(diǎn)。
- 在Data Project Explorer窗口中右鍵單擊存儲(chǔ)過(guò)程,選擇彈出菜單中的Debug...。
- IBM Data Studio 詢問(wèn)我們是否使用調(diào)試視圖,選擇Yes。
- 在調(diào)試視圖中,我們可以點(diǎn)擊 Debug 窗口中的step into,step over進(jìn)行單步調(diào)試,可以在Variables窗口看到當(dāng)前所有變量的值。
圖 9. 設(shè)置 debug 選項(xiàng)
圖 10. Debug 視圖
通過(guò)單步執(zhí)行,我們很快的就找到了出錯(cuò)的代碼:
清單 4. 出錯(cuò)的代碼
DECLARE vMaxId SMALLINT;
...
SELECT MAX(ID)+1 INTO vMaxId FROM USER_STORY;
|
原來(lái),我們把 vMaxId 聲明成 SMALLINT, 然而隨著表 USER_STORY 中數(shù)據(jù)的增加,MAX(ID) 很快就超過(guò)了 SMALLINT 的最大值,這時(shí)我們?cè)侔?MAX(ID) 賦值給 vMaxId,就會(huì)出現(xiàn)溢出的錯(cuò)誤??磥?lái) I_USER_SOTRY 中有一個(gè) bug 。我們應(yīng)當(dāng)把 vMaxId 聲明成 INTEGER 而不是 SMALLINT 。我們把修改后的代碼重新部署到數(shù)據(jù)庫(kù)中后,測(cè)試人員高興的告訴我們,新增 User Story 又重新可用了。
多虧 IBM Data Studio 的調(diào)試功能,使得我們很快的找到并修改了 bug 。
分析存儲(chǔ)過(guò)程性能
我們的系統(tǒng)順利的通過(guò)了功能測(cè)試,接下來(lái)我們要面臨性能測(cè)試的考驗(yàn)了。
在性能測(cè)試時(shí),測(cè)試人員抱怨說(shuō),在查詢 Work Item 的時(shí)候,系統(tǒng)的性能特別差。為了解決性能問(wèn)題,IBM Data Studio 為我們提供了 Visual explain 。 Visual explain 可以幫助我們編寫出高效率的 SQL 語(yǔ)句。這對(duì)于存儲(chǔ)過(guò)程的性能調(diào)優(yōu)非常重要。 IBM Data Studio 可以為我們提供圖形化的執(zhí)行計(jì)劃:在 SQL 編輯器中選中你需要分析的 SQL 語(yǔ)句,單擊右鍵,選擇Visual Explain,然后我們就得到了如下圖所示的 SQL 執(zhí)行計(jì)劃。
圖 11. SQL 執(zhí)行計(jì)劃
通過(guò)查看 Visual Explain,我們得出結(jié)論:由于 WORK_ITEM 表中的數(shù)據(jù)太多,對(duì)全表掃描花費(fèi)太多的時(shí)間,我們應(yīng)該建立合適的索引來(lái)提高性能。建立完索引后,我們?cè)俅螆?zhí)行 Visual Explain ?,F(xiàn)在,其性能就提高了很多。
當(dāng)然,本文中的例子只有兩個(gè)表,略顯簡(jiǎn)單。在實(shí)際項(xiàng)目中,我們往往需要查詢多個(gè)表,查詢條件也會(huì)非常復(fù)雜。通過(guò) Visual Explain 我們可以獲得 SQL 語(yǔ)句是否使用了索引,是否對(duì)某個(gè)表進(jìn)行了多次掃描等信息。這些信息對(duì)優(yōu)化我們的 SQL 語(yǔ)句非常有用。
Data Web Service
我們的系統(tǒng)經(jīng)過(guò)嚴(yán)格的測(cè)試后,終于上線了。用戶對(duì)我們的系統(tǒng)非常滿意。但是他們提出了一個(gè)要求,希望我們的系統(tǒng)可以跟他們另外的一個(gè)業(yè)務(wù)系統(tǒng)進(jìn)行集成。那個(gè)業(yè)務(wù)系統(tǒng)需要獲得 Work Item 的信息,但是它不能直接調(diào)用我們的存儲(chǔ)過(guò)程。經(jīng)過(guò)討論,我們決定把我們的存儲(chǔ)過(guò)程發(fā)布成 Web Service,以方便其業(yè)務(wù)系統(tǒng)的訪問(wèn)。
使用 IBM Data Studio,我們可以很方便的把存儲(chǔ)過(guò)程發(fā)布成 Web Service 。
- 右鍵單擊項(xiàng)目中的文件夾,選擇New Web Service...。
- 在彈出的頁(yè)面中輸入 Web Service 名稱 getWorkItem,點(diǎn)擊Finish。
- 把 Stored Procedures 文件夾下的 S_ITEM_OF_STORY 拖到 Web Service 文件夾下的 getWorkItem 上,這樣一個(gè) Web Service 就構(gòu)建完成了。
圖 12. 創(chuàng)建 web service
下面我們把這個(gè) Web Service 到出為 war 包。
- 右鍵點(diǎn)擊 Web Service 文件夾下的 GetTasks,選擇Build and Deploy...,
- 在彈出的向?qū)ы?yè)面中,指定 web server 的類型和 web service 的類型,點(diǎn)擊Finish, 完成 war 包的導(dǎo)出。
圖 13. 導(dǎo)出 war 包
結(jié)束語(yǔ)
文中的例子雖然簡(jiǎn)單,但是包含了開發(fā)存儲(chǔ)的各個(gè)方面??梢钥闯?IBM Data Studio 對(duì)存儲(chǔ)過(guò)程的開發(fā)的支持是非常全面的。
IBM Data Studio 還提供了很多有用的功能,例如:通過(guò)圖形方式生成 SELECT 語(yǔ)句,可以生成存儲(chǔ)過(guò)程的 Unit Test 程序等等。相信讀者在使用 IBM Data Studio 的過(guò)程中會(huì)不斷發(fā)現(xiàn)一些非常有用的功能。希望本文能促使您開始使用 IBM Data Studio,并且享受 IBM Data Studio 給我們帶來(lái)的開發(fā)存儲(chǔ)過(guò)程的便利。
下載
描述 |
名字 |
大小 |
下載方法 |
本文用到的 SQL 腳本示例 |
sample.zip |
10KB |
HTTP |
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
關(guān)于作者
|
|
|
常偉是一位工作在 IBM CSDL 的軟件工程師,具有四年的 j2ee 開發(fā)經(jīng)驗(yàn)和三年的 DB2 存儲(chǔ)過(guò)程開發(fā)經(jīng)驗(yàn),目前從事企業(yè)電子商務(wù)應(yīng)用的開發(fā)。您可以通過(guò) changwei@cn.ibm.com 和他聯(lián)系。
|