PowerBuilder提供了四种格式的动态SQL语句
1. 既无输入参数,也无结果集。
EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};
TransactionObject是事务对象名,大括号表示该子句可以省略,省略时使用SQLCA。
Execute Immediate "Create Table table1( code char(6),name char(30) )" Using SQLCA;
String ls_sql
ls_sql = "INSERT INTO TABLE table1 VALUES('20010','张三')"
Execute Immediate :ls_sql Using SQLCA;
2. 有输入参数,但没有结果集。
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicstagingArea{USING Parameterlist};
其中:DynamicstagingArea是PowerBuilder提供的一种数据类型。PowerBuilder本身提供了一个名字为SQLSA的DynamicstagingArea类型的全局变量,用于保存要执行的动态SQL语句信息。
//删除table1表中的满足一定条件的记录。
String ls_code
ls_code = "20010"
Prepare SQLSA From "Delete table1 Where code=?" Using SQLCA;
Execute SQLSA Using :ls_code;
3. 编译时已经知道参数和结果集的列。
在返回结果时由于不知道满足过滤条件的记录到底有多少条,因此第三种格式通常采用游标的形式。
DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC cursor {USING Parameterlist};
FETCH cursor INTO VariableList;
CLOSE cursor;
其中cursor是用户所定义的游标的名字。
string ls_sql,ls_where, ls_code,ls_name
ls_sql = "SELECT code,name FROM table1 WHERE code>=?"
ls_where = "20001"
Declare cursor_base Dynamic Cursor for SQLSA;
PrePare SQLSA From :ls_sql Using SQLCA;
Open Dynamic cursor_base Using :ls_where;
Do
Fetch cursor_base INTO :ls_code,:ls_name;
Loop While SQLCA.SQLcode=0
CLOSE cursor_base;
4. 开发程序时尚不知道参数和结果集。
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语句的输入输出参数。通过该对象变量的四个属性NumInputs,InParmType,NumOutputs和OutParmType能够得到输入参数个数、输入参数类型、输出参数个数和输出参数类型的信息。其中InParmType是个数组,每个元素依次对应于SQL语句中的一个问号;OutParmType也是个数组,每个元素对应于一个输出参数。InParmType和OutParmType的数据类型是枚举类型ParmType。
GetDynamicNumber():TypeInteger! TypeDecimal! TypeDouble! TypeLong!TypeReal! ypeBoolean! TypeUnsignedInteger! TypeUnsignedLong!
GetDynamicString():TypeString!
GetDynamicDate():TypeDate!
GetDynamicTime():TypeTime!
GetDynamicDateTime():TypeDateTime!
Int i
String ls_sql, ls_x
Datetime ld_x
ls_sql = "SELECT * FROM table1 WHERE code like ?"
Prepare SQLSA From :ls_sql Using SQLCA;
DESCRIB SQLSA INTO SQLDA; //SQLDA中含有输入输出参数
DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA;
SetDynamicparm(SQLDA,1,"200%") //传递第1个参数值
OPEN DYNAMIC cursor_base USING DESCRIPTOR SQLDA;
DO
FETCH cursor_base USING DESCRIPTOR SQLDA;
FOR i=1 TO SQLDA.NumOutPuts //输出参数个数
CHOOSE CASE SQLDA.OutParmType[i]
CASE Typestring!
ls_x = GetDynamicString(SQLDA,i)∥处理该字符型的字段
CASE TypeDateTime!
ld_x = GetDynamicDateTime(SQLDA,i)∥处理该日期型的字段
END CHOOSE
NEXT
LOOP WHILE SALCA.SQLCODE=0
CLOSE cursor_base;
5. 调用存储过程
DECLARE ProcedureName PROCEDURE FOR StoredProcedureName
@Param1=Value1,
@Param2=Value2,...{USING TransactionObject};
EXECUTE ProcedureName;
FETCH Cursor | Procedure INTO HostVariableList;
string ls_reture
string ls_user
date ld_date
DECLARE p1 PROCEDURE FOR procedure_name
@P_date = :ld_date,
@P_user=:ls_user USING SQLCA;
EXECUTE p1;
if SQLCA.sqlcode=0 then
FETCH p1 into :ls_reture ;
else
rollback USING SQLCA;
messagebox("系统信息","执行错误!")
end if
CLOSE p1;