PowerBuilder提供的四種格式的動態SQL語句

原作者:張繼榮 王舉國 譚琦 謝元呈
一、前言
  PowerBuilder是目前最流行的資料庫開發工具之一。中國農業銀行的“信貸綜合管理系統”和用於上報人民銀行的信貸登記諮詢系統的“介面程式”都是使用PowerBuilder開發的。PowerBuilder提供了在程式碼中加入嵌入式SQL語句的功能來支援對資料庫的訪問。但這種嵌入式SQL語句只能支持一些固定的標準的SQL語句,即在進行程式碼編譯處理時這些SQL語句必須是確定的,例如:對哪張表哪幾個欄位進行操作在程式碼中是固定寫明的,另外這種方式也不能執行像Creat Table,Creat Database等這些資料庫定義的語句(DDL)。因此這種嵌入式SQL語句在實際應用中有一定的局限性。為克服這種方式的局限性,可以使用PowerBuilder提供的動態SQL語句,這種對資料庫訪問的方式可以完成嵌入式SQL語句無法實現的功能。如建庫、建表這一類的資料庫定義語句(DDL);其次,由於動態SQL語句允許在執行時才確定到底要執行怎樣的SQL語句,因此使用動態SQL語句可以使程式實現參數化設計,具有很大的靈活性和通用性。
二、動態SQL語句的應用分析
  PowerBuilder提供了四種格式的動態SQL語句,每種格式都有自己不同的特點和作用。下面我們對各種格式的具體使用方法分別加以說明。
  (一)第一種格式
  當執行沒有輸入參數並且沒有返回結果集的SQL語句時可以使用這種格式,這種格式使用比較簡單,其實現的操作也比較少。
  1語法
  EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};
  其中SQLStatement是要執行的SQL語句,可以直接用引號將要執行的SQL引起來用,或者用字串變數的形式提供SQL語句。通過使用字串變數可以在具體執行的時候才指定要執行什麼樣的SQL語句。TransactionObject是用戶所使用的事務物件,缺省為SQLCA。
  2應用實例
  ①建立一張資料庫表(base),SQL語句的表述用引號引起來直接使用。
  EXECUTE IMMEDIATE‘CREATE TABLE base(code char(6),name char(30))’USING SQLCA;
  ②執行對資料庫記錄的操作,在表base中插入一條記錄,SQL語句通過字串變數傳遞執行語句。
  STRING lsSQL
  LsSQL=”INSERT INTO TABLE base VALUES(’320201’,’市中區支行’)”
  EXECUTE IMMEDIATE:lsSQL;
  (二)第二種格式
  當執行帶輸入參數但沒有返回結果集時的SQL語句可以採用第二種格式。該格式不僅可以動態地指定要執行的SQL語句,同時還可以動態地確定SQL語句所需要的參數值。
  1語法
  PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
  EXECUTE DynamicstagingArea{USING Parameterlist};
  其中:DynamicstagingArea是PowerBuilder提供的一種資料類型。PowerBuilder本身提供了一個名字為SQLSA的DynamicstagingArea類型的總體變數,用於保存要執行的動態SQL語句資訊。
  2應用實例
  刪除base表中的滿足一定條件的記錄。
  STRING lsCode
  lsCode=”320101”
  PREPARE SQLSA FROM“DELETE base WHERE code=?”;
  EXECUTE SQLSA USING:lsCode;

(三)第三種格式
  當執行有輸入參數並且返回結果集的格式在編譯時可以確定的SQL語句時可以使用第三種格式。這種格式語法比較複雜,但要比前面兩種功能強,可以返回結果集。在返回結果時由於不知道滿足過濾條件的記錄到底有多少條,因此第三種格式通常採用游標的形式。
  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
   .
   ∥對滿足條件的記錄根據要求分別進行處理
   .
   FETCH cursor_base INTO:lsCode,:lsName;
  LOOP
  CLOSE cursor_base;
  (四)第四種格式
  當執行有輸入參數並且返回結果集的格式在編譯時無法確定的SQL語句時可以使用第四種格式。有時候我們執行一些SQL語句時,不僅帶有參數而且返回的結果集中有多少個欄位,每個欄位是什麼類型的資料都不確定,這時只能使用第四種格式來實現。
  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提供的一個資料類型,在PowerBuilder中提供了一個DynamicDescriptionObject類型的全局資料類型SQLDA,用來存放動態SQL語句的輸入輸出參數。

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中含有輸入參數的描述
  DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA;
  SetDynamicparm(SQLDA,1,”32%”)∥傳遞參數值
  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;
三、結束語
  從上面的說明和舉例中可以看出動態SQL的特點是功能強,使用靈活,完全可以在程式碼中動態地生成具體要執行的SQL語句,是嵌入式SQL無法比擬的。
  當然動態SQL語句在運行速度上可能要比嵌入式SQL語句略慢一點,但隨著電腦處理速度的大幅度提高,現在來說這一點已不成什麼問題。因此,使用動態SQL語句仍是一種非常可取的處理方法。根據我們在實際編程中的體會,正確使用動態SQL語句可使程式碼簡練、靈活、通用,不僅降低了初次編程的工作量,而且也降低以後對代碼的維護量,能夠取得事半功倍的效果。□
張繼榮(中國農業銀行總行軟體發展中心,北京 100055)
王舉國(中國農業銀行總行軟體發展中心,北京 100055)
譚琦(中國農業銀行總行軟體發展中心,北京 100055)
謝元呈(中國農業銀行總行軟體發展中心,北京 100055)
參考文獻
[1]:《PowerBuilder原理與應用指南》劉紅岩、何軍電子工業出版社
[2]:《PowerBuilder應用開發速成培訓》餘三明、張如健、陳旭電子工業出版社
[3]:《PowerBuilder應用開發技術詳解》王蓉電子工業出版社
[4]:《PowerBuilder 0nLineBooks》


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值