如何使用 .NET 执行多个 Oracle SQL 语句
Posted
技术标签:
【中文标题】如何使用 .NET 执行多个 Oracle SQL 语句【英文标题】:How can I execute multiple Oracle SQL statements with .NET 【发布时间】:2009-02-09 15:42:34 【问题描述】:作为构建过程的一部分,我们希望针对新的数据库实例执行由 DDL 和 DML 语句组成的 SQL 脚本。
如果不解析和拆分脚本,ADO.NET 连接/命令将无法处理此问题。
sqlplus
命令行实用程序只能以交互方式执行脚本,不适合批量使用。
我错过了什么?使用oracle时如何执行sql脚本?
【问题讨论】:
【参考方案1】:为什么您认为 SQLPlus 实用程序不适合批量使用?使用它来运行这些类型的脚本是很常见的——如果你愿意,你可以在调用它时将脚本传递给 SQLPlus,即
sqlplus scott/tiger@someDatabase @someScript.sql
这是部署构建的一种非常常见的方式。
如果问题出在 SQL*Plus 处理错误的方式上,您可以简单地添加一行
WHENEVER SQLERROR EXIT SQL.SQLCODE
中止并抛出遇到的 Oracle 错误号。 WHENEVER SQLERROR command 的文档还提供了许多其他选项。
【讨论】:
我已经尝试过了——当发生错误时,sqlplus 只会继续执行脚本的其余部分,这是不可取的。 sqlplus 不返回错误信息,没有进程退出代码,什么都没有,我猜它可以生成日志文件,但是我是否必须解析一个日志文件才能找出问题所在? 您应该能够使用 WHENEVER SQLERROR 命令来控制该行为。请参阅扩展答案。 OK,当 SQLERROR EXIT FAILURE 将完成这项工作 感谢您的快速响应!我猜 oracle 需要一些时间来适应【参考方案2】:德夫迪米,
我同意 Erik K。
是的,您可以在匿名块中包含 DDL。
DECLARE
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE foo';
END;
请记住,DDL 在运行之前和之后都会进行提交。所以作为交易的一部分,它有点糟糕。
【讨论】:
是的,它有效,我只是不知道 WHENEVER SQLERROR 命令。它实际上正是我需要的。由于自动提交,我不能使用匿名程序。 DDL 无论从哪里调用都会自动提交。这是 DDL 和 Oracle 的本质。没有两种方法。【参考方案3】:我认为如果将语句包装在 DECLARE/BEGIN/END 中,就可以做到这一点。不过,我无法再访问 Oracle,因此无法对其进行测试。 示例:
DECLARE
BEGIN
INSERT INTO ...;
UPDATE something ...;
END;
既然要执行 DDL,请使用EXECUTE IMMEDIATE
。
【讨论】:
问题是我们也有DDL,我认为不能在匿名存储过程中执行但我也会尝试,谢谢。以上是关于如何使用 .NET 执行多个 Oracle SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?