(四)第四种格式
当执行有输入参数并且返回结果集的格式在编译时无法确定的SQL语句时可以使用第四种格式有时候我们执行一些SQL语句时不仅带有参数而且返回的结果集中有多少个字段每个字段是什么类型的数据都不确定这时只能使用第四种格式来实现
语法
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语句的输入输出参数
应用实例
将一个表中满足过滤条件的记录的所有字段取出来分别进行处理表名在程序运行中由字符串变量传递字段信息是不确定的这里我们假设通过字符串变量中传递的表名是base
STRING lsStringlsSQLlsTablelsColumn
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%)∥传递参数值
OPEN DYNAMIC cursor_base USING DESCRIPTOR SQLDA;
FETCH cursor_base USING DESCRIPTOR SQLDA;
DO WHILE SALCASQLCODE=
FOR liInt= TO SQLDANumOutPuts
CHOOSE CASE SQLDAOutParmType[liInt]
CASE Typestring!
lsString=GetDynamicString(SQLDAliInt)
∥处理该字符型的字段
CASE TypeDateTime
LsDateTime=GetDynamicDateTime(SQLDAliInt)
∥处理该日期型的字段
… ∥处理其他类型的字段
… END CHOOSE
NEXT
∥将一条记录的所有字段取完后作相应的处理
FETCH cursor_base USING DESCRIPTOR SQLDA;
LOOP
CLOSE cursor_base;
二结束语
从上面的说明和举例中可以看出动态SQL的特点是功能强使用灵活完全可以在程序代码中动态地生成具体要执行的SQL语句是嵌入式SQL无法比拟的当然动态SQL语句在运行速度上可能要比嵌入式SQL语句略慢一点但随着计算机处理速度的大幅度提高现在来说这一点已不成什么问题因此使用动态SQL语句仍是一种非常可取的处理方法
[] []