如何使用.NET执行多个Oracle SQL语句
作为构建过程的一部分,我们希望针对新的数据库实例执行由DDL和DML语句组成的SQL脚本 如果不分析和拆分脚本,ADO.NET连接/命令将无法处理此问题如何使用.NET执行多个Oracle SQL语句,.net,sql,oracle,.net,Sql,Oracle,作为构建过程的一部分,我们希望针对新的数据库实例执行由DDL和DML语句组成的SQL脚本 如果不分析和拆分脚本,ADO.NET连接/命令将无法处理此问题 sqlplus命令行实用程序只能以交互方式执行脚本,不适合批量使用 我错过了什么?使用oracle时如何执行sql脚本 为什么您认为SQLPlus实用程序不适合批量使用?在运行这类脚本时使用它是很常见的——如果愿意,可以在调用它时将脚本传递给SQLPlus,例如 sqlplus scott/tiger@someDatabase @someScr
sqlplus
命令行实用程序只能以交互方式执行脚本,不适合批量使用
我错过了什么?使用oracle时如何执行sql脚本 为什么您认为SQLPlus实用程序不适合批量使用?在运行这类脚本时使用它是很常见的——如果愿意,可以在调用它时将脚本传递给SQLPlus,例如
sqlplus scott/tiger@someDatabase @someScript.sql
这是部署构建的一种非常常见的方法
如果问题在于SQL*Plus处理错误的方式,则只需添加行即可
WHENEVER SQLERROR EXIT SQL.SQLCODE
中止并抛出遇到的Oracle错误号。的文档还提供了许多其他选项。我认为,如果将语句封装在DECLARE/BEGIN/END中,就可以实现这一点。我再也无法访问Oracle,因此无法对其进行测试。 例如: 由于要执行DDL,请使用
executeimmediate
Devdimi
我同意埃里克的观点
是的,您可以在匿名块中包含DDL
DECLARE
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE foo';
END;
请记住,DDL在运行之前和之后都会进行提交。所以作为交易的一部分,它有点糟糕 我已经试过了——当出现错误时,sqlplus只会继续处理脚本的其余部分,这是不可取的。sqlplus不返回错误信息,没有进程退出代码,没有任何东西我想它可以生成日志文件,但是我是否必须解析日志文件才能找出错误?您应该能够使用where-SQLERROR命令来控制该行为。请参阅扩展答案。好的,只要SQLERROR退出失败,就会完成任务,感谢您的快速响应!我想oracle需要一些时间来适应这个问题,因为我们也有DDL,我认为它不能在匿名存储过程中执行,但我也会尝试一下,谢谢。是的,它可以工作,我只是不知道where-SQLERROR命令。它实际上正是我所需要的。我不能使用匿名过程,因为automatic commits.DDL会自动提交,无论从何处调用它。这是DDL和Oracle的本质。没有两条路可走。
DECLARE
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE foo';
END;