国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

淺析PowerBuilder下動(dòng)態(tài)SQL語(yǔ)句

2024-07-21 02:09:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

淺析powerbuilder下動(dòng)態(tài)sql語(yǔ)句 
作者:張繼榮 王舉國(guó) 譚琦 謝元呈 發(fā)文時(shí)間:2004.12.22
 
powerbuilder是目前最流行的數(shù)據(jù)庫(kù)開(kāi)發(fā)工具之一。powerbuilder提供了在程序代碼中加入嵌入式sql語(yǔ)句的功能來(lái)支持對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。但這種嵌入式sql語(yǔ)句只能支持一些固定的標(biāo)準(zhǔn)的sql語(yǔ)句,即在進(jìn)行程序代碼編譯處理時(shí)這些sql語(yǔ)句必須是確定的,例如:對(duì)哪張表哪幾個(gè)字段進(jìn)行操作在程序代碼中是固定寫(xiě)明的,另外這種方式也不能執(zhí)行像creat table,creat database等這些數(shù)據(jù)庫(kù)定義的語(yǔ)句(ddl)。

因此這種嵌入式sql語(yǔ)句在實(shí)際應(yīng)用中有一定的局限性。為克服這種方式的局限性,可以使用powerbuilder提供的動(dòng)態(tài)sql語(yǔ)句,這種對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的方式可以完成嵌入式sql語(yǔ)句無(wú)法實(shí)現(xiàn)的功能。如建庫(kù)、建表這一類(lèi)的數(shù)據(jù)庫(kù)定義語(yǔ)句(ddl);其次,由于動(dòng)態(tài)sql語(yǔ)句允許在執(zhí)行時(shí)才確定到底要執(zhí)行怎樣的sql語(yǔ)句,因此使用動(dòng)態(tài)sql語(yǔ)句可以使程序?qū)崿F(xiàn)參數(shù)化設(shè)計(jì),具有很大的靈活性和通用性。

一、動(dòng)態(tài)sql語(yǔ)句的應(yīng)用分析 powerbuilder提供了四種格式的動(dòng)態(tài)sql語(yǔ)句,每種格式都有自己不同的特點(diǎn)和作用。下面我們對(duì)各種格式的具體使用方法分別加以說(shuō)明。

  (一)第一種格式

  當(dāng)執(zhí)行沒(méi)有輸入?yún)?shù)并且沒(méi)有返回結(jié)果集的sql語(yǔ)句時(shí)可以使用這種格式,這種格式使用比較簡(jiǎn)單,其實(shí)現(xiàn)的操作也比較少。

  1語(yǔ)法

  execute immediate sqlstatement{using transactionobject};
  其中sqlstatement是要執(zhí)行的sql語(yǔ)句,可以直接用引號(hào)將要執(zhí)行的sql引起來(lái)用,或者用字符串變量的形式提供sql語(yǔ)句。通過(guò)使用字符串變量可以在具體執(zhí)行的時(shí)候才指定要執(zhí)行什么樣的sql語(yǔ)句。transactionobject是用戶(hù)所使用的事務(wù)對(duì)象,缺省為sqlca。

  2應(yīng)用實(shí)例

  ①建立一張數(shù)據(jù)庫(kù)表(base),sql語(yǔ)句的表述用引號(hào)引起來(lái)直接使用。
  execute immediate‘create table base(code char(6),name char(30))’using sqlca;

  ②執(zhí)行對(duì)數(shù)據(jù)庫(kù)記錄的操作,在表base中插入一條記錄,sql語(yǔ)句通過(guò)字符串變量傳遞執(zhí)行語(yǔ)句。
  string lssql
  lssql=”insert into table base values(’320201’,’市中區(qū)支行’)”
  execute immediate:lssql;

  (二)第二種格式

  當(dāng)執(zhí)行帶輸入?yún)?shù)但沒(méi)有返回結(jié)果集時(shí)的sql語(yǔ)句可以采用第二種格式。該格式不僅可以動(dòng)態(tài)地指定要執(zhí)行的sql語(yǔ)句,同時(shí)還可以動(dòng)態(tài)地確定sql語(yǔ)句所需要的參數(shù)值。

  1語(yǔ)法

  prepare dynamicstagingarea from sqlstatement{using transactionobject};
  execute dynamicstagingarea{using parameterlist};
  其中:dynamicstagingarea是powerbuilder提供的一種數(shù)據(jù)類(lèi)型。powerbuilder本身提供了一個(gè)名字為sqlsa的dynamicstagingarea類(lèi)型的全局變量,用于保存要執(zhí)行的動(dòng)態(tài)sql語(yǔ)句信息。

  2應(yīng)用實(shí)例

  刪除base表中的滿(mǎn)足一定條件的記錄。

  string lscode
  lscode=”320101”
  prepare sqlsa from“delete base where code=?”;
  execute sqlsa using:lscode;
  (三)第三種格式

  當(dāng)執(zhí)行有輸入?yún)?shù)并且返回結(jié)果集的格式在編譯時(shí)可以確定的sql語(yǔ)句時(shí)可以使用第三種格式。這種格式語(yǔ)法比較復(fù)雜,但要比前面兩種功能強(qiáng),可以返回結(jié)果集。在返回結(jié)果時(shí)由于不知道滿(mǎn)足過(guò)濾條件的記錄到底有多少條,因此第三種格式通常采用游標(biāo)的形式。

  1語(yǔ)法

  declare cursor dynamic cursor for dynamicstagingarea;
  prepare dynamicstagingarea from sqlstatement{using transactionobject};
  open dynamic cursor {using parameterlist};
  fetch cursor into variablelist;
  close cursor;
  其中cursor是用戶(hù)所定義的游標(biāo)的名字。

  2應(yīng)用實(shí)例

  將表base中的code字段中間兩位為”01”的所有記錄讀取出來(lái)并分別進(jìn)行相應(yīng)處理。
  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
   .   ∥對(duì)滿(mǎn)足條件的記錄根據(jù)要求分別進(jìn)行處理
   .   fetch cursor_base into:lscode,:lsname;
  loop
  close cursor_base;
  (四)第四種格式

  當(dāng)執(zhí)行有輸入?yún)?shù)并且返回結(jié)果集的格式在編譯時(shí)無(wú)法確定的sql語(yǔ)句時(shí)可以使用第四種格式。有時(shí)候我們執(zhí)行一些sql語(yǔ)句時(shí),不僅帶有參數(shù)而且返回的結(jié)果集中有多少個(gè)字段,每個(gè)字段是什么類(lèi)型的數(shù)據(jù)都不確定,這時(shí)只能使用第四種格式來(lái)實(shí)現(xiàn)。

  1語(yǔ)法

  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提供的一個(gè)數(shù)據(jù)類(lèi)型,在powerbuilder中提供了一個(gè)dynamicdescriptionobject類(lèi)型的全局?jǐn)?shù)據(jù)類(lèi)型sqlda,用來(lái)存放動(dòng)態(tài)sql語(yǔ)句的輸入輸出參數(shù)。
  2應(yīng)用實(shí)例

  將一個(gè)表中滿(mǎn)足過(guò)濾條件的記錄的所有字段取出來(lái)分別進(jìn)行處理,表名在程序運(yùn)行中由字符串變量傳遞,字段信息是不確定的。這里我們假設(shè)通過(guò)字符串變量中傳遞的表名是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)
    ∥處理該日期型的字段

    ...     ∥處理其他類(lèi)型的字段

    ...     end choose
    next
    ∥將一條記錄的所有字段取完后作相應(yīng)的處理
    fetch cursor_base using descriptor sqlda;
  loop
  close cursor_base;

二、結(jié)束語(yǔ)

從上面的說(shuō)明和舉例中可以看出動(dòng)態(tài)sql的特點(diǎn)是功能強(qiáng),使用靈活,完全可以在程序代碼中動(dòng)態(tài)地生成具體要執(zhí)行的sql語(yǔ)句,是嵌入式sql無(wú)法比擬的。當(dāng)然動(dòng)態(tài)sql語(yǔ)句在運(yùn)行速度上可能要比嵌入式sql語(yǔ)句略慢一點(diǎn),但隨著計(jì)算機(jī)處理速度的大幅度提高,現(xiàn)在來(lái)說(shuō)這一點(diǎn)已不成什么問(wèn)題。

因此,使用動(dòng)態(tài)sql語(yǔ)句仍是一種非常可取的處理方法。根據(jù)我們?cè)趯?shí)際編程中的體會(huì),正確使用動(dòng)態(tài)sql語(yǔ)句可使程序代碼簡(jiǎn)練、靈活、通用,不僅降低了初次編程的工作量,而且也降低以后對(duì)代碼的維護(hù)量,能夠取得事半功倍的效果。(t117)

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 康平县| 冕宁县| 金门县| 达日县| 社旗县| 瑞金市| 深泽县| 长治县| 沈阳市| 喀什市| 建平县| 舟曲县| 西昌市| 玉山县| 武宣县| 永吉县| 都昌县| 铁岭县| 青田县| 延津县| 平舆县| 湖口县| 江西省| 乐清市| 日照市| 德兴市| 博湖县| 平南县| 达拉特旗| 浙江省| 汝州市| 新疆| 阜城县| 晴隆县| 阿拉善盟| 伊宁市| 浪卡子县| 成武县| 兴城市| 和政县| 忻城县|