使用 OCCI oracle 在 C++ 中执行 PL/SQL 脚本

Posted

技术标签:

【中文标题】使用 OCCI oracle 在 C++ 中执行 PL/SQL 脚本【英文标题】:Execute PL/SQL script in C++ using OCCI oracle 【发布时间】:2014-06-27 05:50:19 【问题描述】:

我想从 C++ 程序运行 SQL 脚本。我的代码是这样的:

int main()
 
//.....
sql_stmt = "Insert into t1 values ('qwerty');\nInsert into t1 values ('dothar');"
           "//and many more INSERT statements";

sql_stmt = "DECLARE\nrollback_check_counter number;\n"
"BEGIN\n"
"rollback_check_counter :=1;\n"
"SAVEPOINT sp_1;\nIF rollback_check_counter = 1 THEN\n"
"BEGIN\n"+sql_stmt+"EXCEPTION\n"
"WHEN PROGRAM_ERROR THEN\n"
"rollback_check_counter :=0;\n"
"ROLLBACK TO sp_1;\n"
"WHEN OTHERS THEN\n"
"rollback_check_counter :=0;\n"
"ROLLBACK TO sp_1;\n"
"END;\n"
"END IF;\n"
"commit;\n"
"END;";


try 

    Connection *conn = env->createConnection(user,passwd); //error prone
    Statement *stmt = conn->createStatement();
    stmt->setSQL(sql_stmt);
    row_count = stmt->execute(); //stmt->execute(sql_stmt);

    Connection::conn->terminateStatement(Statement *stmt);
    //con->terminateStatement(stmt);
    env->terminateConnection(conn);
    Environment::terminateEnvironment(env);

catch(SQLException& ex)

//.....
return 0;

虽然当我运行这些插入语句时,它们运行得相当好,但是当我形成一个 SQL 脚本结构时,它们似乎失败了。我想这样做是因为我想实现回滚。我错过了什么?任何人都可以提出任何替代方案来实现它。

【问题讨论】:

直接转储sql语句,直接在类似sqlplus的工具中运行看看是否有效。 【参考方案1】:

ROLLBACK TO sp_1 后面都缺少;

【讨论】:

我错过了;在重写它的同时。就这样。感谢您的回复,但问题仍然存在。 顺便说一句,你可以去掉 rollback_check_counter (在这里没有做任何有用的事情)和 WHEN PROGRAM_ERROR THEN 部分,因为 WHEN OTHERS THEN 块也一样。 实际上 sql_stmt 由 400-450 个插入语句组成。我打算一次执行 400-500 INSERTS,所以如果发生任何错误,那么 [rollback_check_counter] 就会起作用并且可以处理。关于“WHEN PROGRAM_ERROR THEN 阻塞和 WHEN OTHERS THEN 阻塞”,我不能再同意了,一定是我的编程很糟糕。

以上是关于使用 OCCI oracle 在 C++ 中执行 PL/SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 Qt 在 Linux 上连接到 Oracle DB

使用 Oracle OCCI 回滚事务

在 C++ 和 Oracle 数据库之间传递数据时的浮点精度问题

ORA-00947: 在 Oracle 中创建对象时值不足

求C++连接oracle 数据库的代码

OCCI的迭代修改