想知道在执行
之前是否有办法验证查询有没有办法检查/验证Query而不执行它?
答案 0 :(得分:2)
我们验证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。与运行整个查询相比,它的时间要短得多。
答案 1 :(得分:0)
由于数据库是“有效”(表和列名称等)的最终仲裁者,因此一般答案是否定的。现在你可以在PB中找到一个类来检查语句语法,对象名称等等,这样你就不必触及数据库,但只要对数据库进行任何更改就会过时。
答案 2 :(得分:0)
将select语句放在任何脚本中并进行编译。部分工作是针对您连接的数据库检查SQL语法。 注意:在SQL语句的列列表中至少需要一个绑定变量。其他DML语句不是这种情况。
实施例: 就我而言:
select noms into :ls_ttt from contacts;
会生成一条消息Unknown columns 'noms' in 'field list'
。
然而,
select nom into :ls_ttt from contacts;
没有显示任何错误。
希望这有帮助。