2024年4月2日发(作者:)

在PB中动态修改数据窗口DW的SQL语句方法注意事项

数据库应用程序通常进行一项确定的工作,在编写和编译时就可以确定完整的SQL语

句,但是在编译时不能确定SQL语句的具体格式和参数时,只能在程序运行过程中构造

SQL语句,需要使用动态SQL语句。以Format 4 动态SQL语句为例,使用格式如下:

DECLARE Cursor | Procedure

DYNAMIC CURSOR | PROCEDURE

FOR DynamicStagingArea ;

PREPARE 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)。定义游标或过程,读取PREPARE

语句中的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_nsobject(sqlca)

sql_string=dw_be("")

// 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_select(sql_new)=-1) then

messagebox("错误","不能修改SQL语句!",Exclamation!)

return

end if

dw_nsobject(sqlca)

dw_ve()

---- 使用SetSQLSelect有一定的要求和限制,更改后的SELECT语句在结构上必须

与原先的语句匹配,在执行SetSQLSelect函数之前必须用SetTrans或SetTransObject

函数设置DataWindow控件的内部事务对象。另外, DataWindow对象的数据源必须是

一个不带参数的SELECT语句,如果需要使用检索参数,可以在程序代码中修改SQL Select

语句。