熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PB編程 >> 正文

淺析PowerBuilder下動態SQL語句[1]

2013-11-23 17:28:37  來源: PB編程 

  PowerBuilder是目前最流行的數據庫開發工具之一PowerBuilder提供了在程序代碼中加入嵌入式SQL語句的功能來支持對數據庫的訪問但這種嵌入式SQL語句只能支持一些固定的標准的SQL語句即在進行程序代碼編譯處理時這些SQL語句必須是確定的另外這種方式也不能執行像Creat TableCreat Database等這些數據庫定義的語句(DDL)

  因此這種嵌入式SQL語句在實際應用中有一定的局限性為克服這種方式的局限性可以使用PowerBuilder提供的動態SQL語句這種對數據庫訪問的方式可以完成嵌入式SQL語句無法實現的功能如建庫建表這一類的數據庫定義語句(DDL)其次由於動態SQL語句允許在執行時才確定到底要執行怎樣的SQL語句因此使用動態SQL語句可以使程序實現參數化設計具有很大的靈活性和通用性

  動態SQL語句的應用分析 PowerBuilder提供了四種格式的動態SQL語句每種格式都有自己不同的特點和作用

  (一)第一種格式

  當執行沒有輸入參數並且沒有返回結果集的SQL語句時可以使用這種格式這種格式使用比較簡單其實現的操作也比較少

   語法

  EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};

  其中SQLStatement是要執行的SQL語句可以直接用引號將要執行的SQL引起來用或者用字符串變量的形式提供SQL語句通過使用字符串變量可以在具體執行的時候才指定要執行什麼樣的SQL語句TransactionObject是用戶所使用的事務對象缺省為SQLCA

   應用實例

  ①建立一張數據庫表(base)SQL語句的表述用引號引起來直接使用

  EXECUTE IMMEDIATECREATE TABLE base(code char(name char())USING SQLCA;

  ②執行對數據庫記錄的操作在表base中插入一條記錄SQL語句通過字符串變量傳遞執行語句

  STRING lsSQL

  LsSQL=INSERT INTO TABLE base VALUES(市中區支行

  EXECUTE IMMEDIATE:lsSQL;

  (二)第二種格式

  當執行帶輸入參數但沒有返回結果集時的SQL語句可以采用第二種格式該格式不僅可以動態地指定要執行的SQL語句同時還可以動態地確定SQL語句所需要的參數值

   語法

  PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};

  EXECUTE DynamicstagingArea{USING Parameterlist};

  其中DynamicstagingArea是PowerBuilder提供的一種數據類型PowerBuilder本身提供了一個名字為SQLSA的DynamicstagingArea類型的全局變量用於保存要執行的動態SQL語句信息

   應用實例

  刪除base表中的滿足一定條件的記錄

  STRING lsCode

  lsCode=

  PREPARE SQLSA FROMDELETE base WHERE code=?;

  EXECUTE SQLSA USING:lsCode;

  (三)第三種格式

  當執行有輸入參數並且返回結果集的格式在編譯時可以確定的SQL語句時可以使用第三種格式這種格式語法比較復雜但要比前面兩種功能強可以返回結果集在返回結果時由於不知道滿足過濾條件的記錄到底有多少條因此第三種格式通常采用游標的形式

   語法

  DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea;

  PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};

  OPEN DYNAMIC cursor {USING Parameterlist};

  FETCH cursor INTO VariableList;

  CLOSE cursor;

  其中cursor是用戶所定義的游標的名字

   應用實例

  將表base中的code字段中間兩位為的所有記錄讀取出來並分別進行相應處理

  STRING lsSQLlsCodelsNamelsFilter

  LsFilter=

  LsSQL=SELECT codename FROM base WHERE substring(code)=?

  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 SQLCASQLCODE=

   ∥對滿足條件的記錄根據要求分別進行處理

   FETCH cursor_base INTO:lsCode:lsName;

  LOOP

  CLOSE cursor_base;

[]  []  


From:http://tw.wingwit.com/Article/program/PB/201311/24649.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.