如何在不在 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;

没有显示任何错误。

希望这对您有所帮助。