如何使用 .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 语句的主要内容,如果未能解决你的问题,请参考以下文章

java中如何获取oracle存储过程返回的多个值。

oracle中的存储过程如何返回查询到的多个值?

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

如何在Oracle中一次执行多条sql语句

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

Oracle:查找多个查询运行的总查询运行时间