如何在PowerBuilder中执行时验证查询

时间:2018-05-04 12:05:11

标签: validation syntax powerbuilder

想知道在执行

之前是否有办法验证查询

有没有办法检查/验证Query而不执行它?

3 个答案:

答案 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;

没有显示任何错误。

希望这有帮助。