PowerBuilder是目前最流行数据库开发工具的PowerBuilder提供了在代码中加入嵌入式SQL语句功能来支持对数据库访问但这种嵌入式SQL语句只能支持些固定标准SQL语句即在进行代码编译处理时这些SQL语句必须是确定例如:对哪张表哪几个字段进行操作在代码中是固定写明另外这种方式也不能执行像Creat Table,Creat Database等这些数据库定义语句(DDL)
因此这种嵌入式SQL语句在实际应用中有定局限性为克服这种方式局限性可以使用PowerBuilder提供动态SQL语句这种对数据库访问方式可以完成嵌入式SQL语句无法实现功能如建库、建表这类数据库定义语句(DDL);其次由于动态SQL语句允许在执行时才确定到底要执行怎样SQL语句因此使用动态SQL语句可以使实现参数化设计具有很大灵活性和通用性
、动态SQL语句应用分析 PowerBuilder提供了 4种格式动态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;
( 2)第 2种格式
当执行带输入参数但没有返回结果集时SQL语句可以采用第 2种格式该格式不仅可以动态地指定要执行SQL语句同时还可以动态地确定SQL语句所需要参数值
1语法
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicstagingArea{USING Parameterlist};
其中:DynamicstagingArea是PowerBuilder提供种数据类型PowerBuilder本身提供了个名字为SQLSADynamicstagingArea类型全局变量用于保存要执行动态SQL语句信息
2应用例子
删除base表中满足定条件记录
STRING lsCode
lsCode=”320101”
PREPARE SQLSA FROM“DELETE base WHERE code=?”;
EXECUTE SQLSA USING:lsCode;
( 3)第 3种格式
当执行有输入参数并且返回结果集格式在编译时可以确定SQL语句时可以使用第 3种格式这种格式语法比较复杂但要比前面两种功能强可以返回结果集在返回结果时由于不知道满足过滤条件记录到底有多少条因此第 3种格式通常采用游标形式
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 codename FROM base WHERE sub(code32)=?”
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;
( 4)第 4种格式
当执行有输入参数并且返回结果集格式在编译时无法确定SQL语句时可以使用第 4种格式有时候我们执行些SQL语句时不仅带有参数而且返回结果集中有多少个字段每个字段是什么类型数据都不确定这时只能使用第 4种格式来实现
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 Type!
lsString=GetDynamicString(SQLDA,liInt)
∥处理该型字段
CASE TypeDateTime
LsDateTime=GetDynamicDateTime(SQLDA,liInt)
∥处理该日期型字段
... ∥处理其他类型字段
... END CHOOSE
NEXT
∥将条记录所有字段取完后作相应处理
FETCH cursor_base USING DESCRIPTOR SQLDA;
LOOP
CLOSE cursor_base;
2、结束语
从上面介绍说明和举例中可以看出动态SQL特点是功能强使用灵活完全可以在代码中动态地生成具体要执行SQL语句是嵌入式SQL无法比拟当然动态SQL语句在运行速度上可能要比嵌入式SQL语句略慢点但随着计算机处理速度大幅度提高现在来说这点已不成什么问题
因此使用动态SQL语句仍是种非常可取处理思路方法根据我们在实际编程中体会正确使用动态SQL语句可使代码简练、灵活、通用不仅降低了初次编程工作量而且也降低以后对代码维护量能够取得事半功倍效果
最新评论