【问题标题】:How can I execute multiple Oracle SQL statements with .NET如何使用 .NET 执行多个 Oracle SQL 语句
【发布时间】:2009-02-09 15:42:34
【问题描述】:

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

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

sqlplus 命令行实用程序只能以交互方式执行脚本,不适合批量使用。

我错过了什么?使用oracle时如何执行sql脚本?

【问题讨论】:

    标签: .net sql oracle


    【解决方案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,我认为不能在匿名存储过程中执行但我也会尝试,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2023-04-01
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多