如何在不在 PowerBuilder 中执行的情况下验证查询
How to validate a query without executing in PowerBuilder
想知道是否有办法在执行之前验证查询
有没有办法check/validate查询而不执行?
由于数据库是 "valid"(table 和列名等)的最终仲裁者,所以一般答案是否定的。现在你可以在 PB 中想出一个 class 来检查语句语法、对象名称等,这样你就不必接触数据库,但只要对数据库进行任何更改,它就会过时。
我们验证 SQL 的一种方法是向 SQL 添加一个永远不可能为真的条件。
示例:
long ll_rc
long ll_result
string ls_sql, ls_test
string ls_message
//Arbitrary SQL
ls_sql = "SELECT * FROM DUAL"
//This SQL when executed will always return 0 if successful.
ls_test = "select count(*) from ( " + ls_sql + " WHERE 1 = 2 )"
DECLARE l_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :ls_test;
OPEN DYNAMIC l_cursor;
ll_rc = SQLCA.SQLCODE
choose case ll_rc
case 0
//Success
ls_message = "SQL is properly formed"
case 100
//Fetched row not found. This should not be the case since we only opened the cursor
ls_message = SQLCA.SQLERRTEXT
case -1
//Error; the statement failed. Use SQLErrText or SQLDBCode to obtain the detail.
ls_message = SQLCA.SQLERRTEXT
end choose
CLOSE l_cursor ; //This will fail if open cursor failed.
messagebox( "Result", ls_message )
注意:如果您的 SQL 非常复杂(我怀疑不是),数据库优化器可能需要几秒钟来准备您的 SQL。与 运行 整个查询相比,这将大大减少时间。
将select 语句放在任何脚本中并编译它。部分工作是根据您连接的数据库检查 SQL 语法。
注意:您的 SQL 语句的列列表中至少需要一个绑定变量。其他 DML 语句不是这种情况。
示例:
就我而言:
select noms into :ls_ttt from contacts;
生成消息 Unknown columns 'noms' in 'field list'
。
然而,
select nom into :ls_ttt from contacts;
没有显示任何错误。
希望这对您有所帮助。
想知道是否有办法在执行之前验证查询
有没有办法check/validate查询而不执行?
由于数据库是 "valid"(table 和列名等)的最终仲裁者,所以一般答案是否定的。现在你可以在 PB 中想出一个 class 来检查语句语法、对象名称等,这样你就不必接触数据库,但只要对数据库进行任何更改,它就会过时。
我们验证 SQL 的一种方法是向 SQL 添加一个永远不可能为真的条件。
示例:
long ll_rc
long ll_result
string ls_sql, ls_test
string ls_message
//Arbitrary SQL
ls_sql = "SELECT * FROM DUAL"
//This SQL when executed will always return 0 if successful.
ls_test = "select count(*) from ( " + ls_sql + " WHERE 1 = 2 )"
DECLARE l_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :ls_test;
OPEN DYNAMIC l_cursor;
ll_rc = SQLCA.SQLCODE
choose case ll_rc
case 0
//Success
ls_message = "SQL is properly formed"
case 100
//Fetched row not found. This should not be the case since we only opened the cursor
ls_message = SQLCA.SQLERRTEXT
case -1
//Error; the statement failed. Use SQLErrText or SQLDBCode to obtain the detail.
ls_message = SQLCA.SQLERRTEXT
end choose
CLOSE l_cursor ; //This will fail if open cursor failed.
messagebox( "Result", ls_message )
注意:如果您的 SQL 非常复杂(我怀疑不是),数据库优化器可能需要几秒钟来准备您的 SQL。与 运行 整个查询相比,这将大大减少时间。
将select 语句放在任何脚本中并编译它。部分工作是根据您连接的数据库检查 SQL 语法。 注意:您的 SQL 语句的列列表中至少需要一个绑定变量。其他 DML 语句不是这种情况。
示例: 就我而言:
select noms into :ls_ttt from contacts;
生成消息 Unknown columns 'noms' in 'field list'
。
然而,
select nom into :ls_ttt from contacts;
没有显示任何错误。
希望这对您有所帮助。