作者:張繼榮 王舉國 譚琦 謝元呈
PowerBuilder是目前最流行的數(shù)據(jù)庫開發(fā)工具之一。PowerBuilder提供了在程序代碼中加入嵌入式SQL語句的功能來支持對數(shù)據(jù)庫的訪問。但這種嵌入式SQL語句只能支持一些固定的標準的SQL語句,即在進行程序代碼編譯處理時這些SQL語句必須是確定的,例如:對哪張表哪幾個字段進行操作在程序代碼中是固定寫明的,另外這種方式也不能執(zhí)行像Creat Table,Creat Database等這些數(shù)據(jù)庫定義的語句(DDL)。
因此這種嵌入式SQL語句在實際應用中有一定的局限性。為克服這種方式的局限性,可以使用PowerBuilder提供的動態(tài)SQL語句,這種對數(shù)據(jù)庫訪問的方式可以完成嵌入式SQL語句無法實現(xiàn)的功能。如建庫、建表這一類的數(shù)據(jù)庫定義語句(DDL);其次,由于動態(tài)SQL語句允許在執(zhí)行時才確定到底要執(zhí)行怎樣的SQL語句,因此使用動態(tài)SQL語句可以使程序?qū)崿F(xiàn)參數(shù)化設計,具有很大的靈活性和通用性。
一、動態(tài)SQL語句的應用分析 PowerBuilder提供了四種格式的動態(tài)SQL語句,每種格式都有自己不同的特點和作用。下面我們對各種格式的具體使用方法分別加以說明。
(一)第一種格式
當執(zhí)行沒有輸入?yún)?shù)并且沒有返回結(jié)果集的SQL語句時可以使用這種格式,這種格式使用比較簡單,其實現(xiàn)的操作也比較少。
1語法
EXECUTE IMMEDIATE SQLStatement{USING TransactionObject}; 其中SQLStatement是要執(zhí)行的SQL語句,可以直接用引號將要執(zhí)行的SQL引起來用,或者用字符串變量的形式提供SQL語句。通過使用字符串變量可以在具體執(zhí)行的時候才指定要執(zhí)行什么樣的SQL語句。TransactionObject是用戶所使用的事務對象,缺省為SQLCA。
2應用實例
①建立一張數(shù)據(jù)庫表(base),SQL語句的表述用引號引起來直接使用。 EXECUTE IMMEDIATE‘CREATE TABLE base(code char(6),name char(30))’USING SQLCA;
②執(zhí)行對數(shù)據(jù)庫記錄的操作,在表base中插入一條記錄,SQL語句通過字符串變量傳遞執(zhí)行語句。 STRING lsSQL LsSQL=”INSERT INTO TABLE base VALUES(’320201’,’市中區(qū)支行’)” EXECUTE IMMEDIATE:lsSQL;
(二)第二種格式
當執(zhí)行帶輸入?yún)?shù)但沒有返回結(jié)果集時的SQL語句可以采用第二種格式。該格式不僅可以動態(tài)地指定要執(zhí)行的SQL語句,同時還可以動態(tài)地確定SQL語句所需要的參數(shù)值。
1語法
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject}; EXECUTE DynamicstagingArea{USING Parameterlist}; 其中:DynamicstagingArea是PowerBuilder提供的一種數(shù)據(jù)類型。PowerBuilder本身提供了一個名字為SQLSA的DynamicstagingArea類型的全局變量,用于保存要執(zhí)行的動態(tài)SQL語句信息。
2應用實例
刪除base表中的滿足一定條件的記錄。
STRING lsCode lsCode=”320101” PREPARE SQLSA FROM“DELETE base WHERE code=?”; EXECUTE SQLSA USING:lsCode; (三)第三種格式
當執(zhí)行有輸入?yún)?shù)并且返回結(jié)果集的格式在編譯時可以確定的SQL語句時可以使用第三種格式。這種格式語法比較復雜,但要比前面兩種功能強,可以返回結(jié)果集。在返回結(jié)果時由于不知道滿足過濾條件的記錄到底有多少條,因此第三種格式通常采用游標的形式。
1語法
DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea; PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject}; OPEN DYNAMIC cursor {USING Parameterlist}; FETCH cursor INTO VariableList; CLOSE cursor; 其中cursor是用戶所定義的游標的名字。
2應用實例
將表base中的code字段中間兩位為”01”的所有記錄讀取出來并分別進行相應處理。 STRING lsSQL,lsCode,lsName,lsFilter LsFilter=”01” LsSQL=”SELECT code,name FROM base WHERE substring(code,3,2)=?” DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA; PREPARE SQLSA FROM:lsSQL; OPEN DYNAMIC cursor_base USING:lsFilter; FETCH cursor_base INTO:lsCode,:lsName; DO WHILE SQLCA.SQLCODE=0 . ∥對滿足條件的記錄根據(jù)要求分別進行處理 . FETCH cursor_base INTO:lsCode,:lsName; LOOP CLOSE cursor_base; (四)第四種格式
當執(zhí)行有輸入?yún)?shù)并且返回結(jié)果集的格式在編譯時無法確定的SQL語句時可以使用第四種格式。有時候我們執(zhí)行一些SQL語句時,不僅帶有參數(shù)而且返回的結(jié)果集中有多少個字段,每個字段是什么類型的數(shù)據(jù)都不確定,這時只能使用第四種格式來實現(xiàn)。
1語法
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject}; DESCRIB DynamicStagingArea INTO DynamicDescriptionObject; DECLARE cursor DYNAMIC CURSOR FOR DynamicDescriptionObject; OPEN DYNAMIC cursor USING DESCRIPTOR DynamicDescriptionObject; FETCH cursor USING DESCRIPTOR DynamicDescriptionObject; CLOSE cursor; 其中:DynamicDescriptionObject是PowerBuilder提供的一個數(shù)據(jù)類型,在PowerBuilder中提供了一個DynamicDescriptionObject類型的全局數(shù)據(jù)類型SQLDA,用來存放動態(tài)SQL語句的輸入輸出參數(shù)。 2應用實例
將一個表中滿足過濾條件的記錄的所有字段取出來分別進行處理,表名在程序運行中由字符串變量傳遞,字段信息是不確定的。這里我們假設通過字符串變量中傳遞的表名是base。
STRING lsString,lsSQL,lsTable,lsColumn INT liInt DATETIME liTime LsSQL=”SELECT*FROM base WHERE code like?” PREPARE SQLSA FROM lsSQL; DESCRIB SQLSA INTO SQLDA;∥SQLDA中含有輸入?yún)?shù)的描述 DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA; SetDynamicparm(SQLDA,1,”32%”)∥傳遞參數(shù)值 OPEN DYNAMIC cursor_base USING DESCRIPTOR SQLDA; FETCH cursor_base USING DESCRIPTOR SQLDA; DO WHILE SALCA.SQLCODE=0 FOR liInt=1 TO SQLDA.NumOutPuts CHOOSE CASE SQLDA.OutParmType[liInt] CASE Typestring! lsString=GetDynamicString(SQLDA,liInt) ∥處理該字符型的字段 CASE TypeDateTime LsDateTime=GetDynamicDateTime(SQLDA,liInt) ∥處理該日期型的字段
... ∥處理其他類型的字段
... END CHOOSE NEXT ∥將一條記錄的所有字段取完后作相應的處理 FETCH cursor_base USING DESCRIPTOR SQLDA; LOOP CLOSE cursor_base;
二、結(jié)束語
從上面的說明和舉例中可以看出動態(tài)SQL的特點是功能強,使用靈活,完全可以在程序代碼中動態(tài)地生成具體要執(zhí)行的SQL語句,是嵌入式SQL無法比擬的。當然動態(tài)SQL語句在運行速度上可能要比嵌入式SQL語句略慢一點,但隨著計算機處理速度的大幅度提高,現(xiàn)在來說這一點已不成什么問題。
因此,使用動態(tài)SQL語句仍是一種非常可取的處理方法。根據(jù)我們在實際編程中的體會,正確使用動態(tài)SQL語句可使程序代碼簡練、靈活、通用,不僅降低了初次編程的工作量,而且也降低以后對代碼的維護量,能夠取得事半功倍的效果。
|