pb 的动态游标

pb 的动态游标

(转自:http://zcy9528.blog.163.com/blog/static/3528075420081113260547/

摘要:本文介绍了PowerBuilder开发工具中嵌入式SQL语句与动态SQL语句之间的区别和特点,并通过具体实例详细说明了如何在PowerBuilder中使用动态SQL语句以及四种格式的动态SQL语句各自所能实现的功能。

关键词:PowerBuilder动态SQL嵌入式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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值