在JDBC中,如何知道DDL语句是否成功执行?

时间:2014-10-31 18:13:04

标签: java oracle jdbc resultset ddl

我正在尝试使用JDBC在Oracle 11g数据库上执行DDL语句。我是使用boolean execute(String SQL)类的Statement来完成的。

以下是执行查询并尝试确定查询结果的代码段:

// Create a SQL string
String dropSql = "DROP TABLE Reviews";

stmt = conn.createStatement();

// Execute the query
boolean result = stmt.execute(dropSql);

// Get the result of the drop operation
if(result)
{
    // Its a result set
    System.out.println("Atleast one result set has been returned. Loop through them");
}
else
{
    // Its an update count or no result
    Integer updateCnt = stmt.getUpdateCount();

    if(updateCnt == -1)
    {
        // No results
        System.out.println("No results returned by the query");
    }
    else
    {
        // Update Count 
        System.out.println("Update Count: " + updateCnt);
    }
}

我不是数据库人,但是有一种情况是DDL语句无法执行而不会引发SQLException吗?如果没有,那么我不需要捕获execute方法返回的内容。缺少SQLException表示DDL语句已成功执行。

我所关注的tutorial建议将此方法用于DDL语句:

boolean execute(String SQL) : ....... Use this method to execute SQL DDL statements or when you need to use truly dynamic SQL. 

虽然Jdbc documentation建议使用int executeUpdate(String sql)来执行DDL语句。哪一个在两者中首选?

2 个答案:

答案 0 :(得分:5)

失败的语句将始终引发SQLException,无论使用哪种方法执行它。 executeUpdate适用于任何无法生成ResultSet的语句,这使得它非常适合DDL语句。

答案 1 :(得分:3)

除非你将DDL包装在PL / QSL中并捕获异常,否则它将冒泡到JDBC调用。

至于哪一个使用,任何一个都可以正常工作,因为对于DDL,你应该忽略返回值。

与DML不同,DDL不会注册为"行数"所以只需使用try / catch来捕获失败,并假设在没有异常的情况下,它就成功了。