Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用.NET执行多个Oracle SQL语句_.net_Sql_Oracle - Fatal编程技术网

如何使用.NET执行多个Oracle SQL语句

如何使用.NET执行多个Oracle SQL语句,.net,sql,oracle,.net,Sql,Oracle,作为构建过程的一部分,我们希望针对新的数据库实例执行由DDL和DML语句组成的SQL脚本 如果不分析和拆分脚本,ADO.NET连接/命令将无法处理此问题 sqlplus命令行实用程序只能以交互方式执行脚本,不适合批量使用 我错过了什么?使用oracle时如何执行sql脚本 为什么您认为SQLPlus实用程序不适合批量使用?在运行这类脚本时使用它是很常见的——如果愿意,可以在调用它时将脚本传递给SQLPlus,例如 sqlplus scott/tiger@someDatabase @someScr

作为构建过程的一部分,我们希望针对新的数据库实例执行由DDL和DML语句组成的SQL脚本

如果不分析和拆分脚本,ADO.NET连接/命令将无法处理此问题

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;