在PB中动态修改SQL语句
江苏省南通电信局网管中心 黄莹
---- PowerBuilder是图形界面的Client/Server应用程序开发环境,可以很容易开发出功能强大的应用程序,在当前应用非常广泛。
DECLARE Cursor Procedure
DYNAMIC CURSOR PROCEDURE
FOR DynamicStagingArea ;
divPARE DynamicStagingArea FROM SQLStatement
{USING TransactionObject} ;
DESCRIBE DynamicStagingArea
INTO DynamicDescriptionArea ;
OPEN DYNAMIC Cursor Procedure
USING DESCRIPTOR DynamicDescriptionArea} ;
EXECUTE DYNAMIC Cursor Procedure
USING DESCRIPTOR DynamicDescriptionArea ;
FETCH Cursor Procedure
USING DESCRIPTOR DynamicDescriptionArea ;
CLOSE Cursor Procedure ;
---- 在使用动态SQL语句时,需准备DynamicStagingArea对象(全局对象SQLSA)和DynamicDescriptionArea对象(全局对象SQLDA)。定义游标或过程,读取divPARE语句中的SQL语句以及语句中说明的参数和类型,执行FETCH语句后,调用相关的函数逐条读取并处理检索结果。
---- 动态SQL语句虽然解能够在程序运行过程中构造SQL语句,但在实际应用中较少使用。若SELECT语句的结果序列一定,可以通过重新指定DataWindow对象的SELECT语句的方法,达到动态修改SQL语句的功能。运用时首先用Describe函数读取DataWindow对象的SELECT语句,用Replace等函数修改出符合要求的SELECT语句,并且可以增加检索条件,再用SetSQLSelect函数为DataWindow控件指定修改后的SELECT语句。
---- 程序代码:
string sql_string,sql_new
long start_pos=1
string old_str //select语句中需要替换的字符串
string new_str //替换字符串,可以是结构相同的表名
dw_1.settransobject(sqlca)
sql_string=dw_1.Describe("DataWindow.Table.Select")
// Find the first occurrence of old_str.
start_pos = Pos(sql_string, old_str, start_pos)
// Only enter the loop if you find old_str.
DO WHILE start_pos > 0
// Replace old_str with new_str.
sql_string = Replace(sql_string, start_pos, &
Len(old_str), new_str)
// Find the next occurrence of old_str.
start_pos = Pos(sql_string, old_str, &
start_pos+Len(new_str))
LOOP
sql_new=sql_string+" where ……" //增加where字句
//判断setsqlselect 函数调用是否成功 ,不成功则返回
if (dw_1.setsqlselect(sql_new)=-1) then
messagebox("错误","不能修改SQL语句!",Exclamation!)
return
end if
dw_1.settransobject(sqlca)
dw_1.retrieve()
---- 使用SetSQLSelect有一定的要求和限制,更改后的SELECT语句在结构上必须与原先的语句匹配,在执行SetSQLSelect函数之前必须用SetTrans或SetTransObject函数设置DataWindow控件的内部事务对象。另外, DataWindow对象的数据源必须是一个不带参数的SELECT语句,如果需要使用检索参数,可以在程序代码中修改SQL Select语句。