【发布时间】:2009-02-09 15:42:34
【问题描述】:
作为构建过程的一部分,我们希望针对新的数据库实例执行由 DDL 和 DML 语句组成的 SQL 脚本。
如果不解析和拆分脚本,ADO.NET 连接/命令将无法处理此问题。
sqlplus 命令行实用程序只能以交互方式执行脚本,不适合批量使用。
我错过了什么?使用oracle时如何执行sql脚本?
【问题讨论】:
作为构建过程的一部分,我们希望针对新的数据库实例执行由 DDL 和 DML 语句组成的 SQL 脚本。
如果不解析和拆分脚本,ADO.NET 连接/命令将无法处理此问题。
sqlplus 命令行实用程序只能以交互方式执行脚本,不适合批量使用。
我错过了什么?使用oracle时如何执行sql脚本?
【问题讨论】:
为什么您认为 SQLPlus 实用程序不适合批量使用?使用它来运行这些类型的脚本是很常见的——如果你愿意,你可以在调用它时将脚本传递给 SQLPlus,即
sqlplus scott/tiger@someDatabase @someScript.sql
这是部署构建的一种非常常见的方式。
如果问题出在 SQL*Plus 处理错误的方式上,您可以简单地添加一行
WHENEVER SQLERROR EXIT SQL.SQLCODE
中止并抛出遇到的 Oracle 错误号。 WHENEVER SQLERROR command 的文档还提供了许多其他选项。
【讨论】:
德夫迪米,
我同意 Erik K。
是的,您可以在匿名块中包含 DDL。
DECLARE
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE foo';
END;
请记住,DDL 在运行之前和之后都会进行提交。所以作为交易的一部分,它有点糟糕。
【讨论】:
我认为如果将语句包装在 DECLARE/BEGIN/END 中,就可以做到这一点。不过,我无法再访问 Oracle,因此无法对其进行测试。 示例:
DECLARE
BEGIN
INSERT INTO ...;
UPDATE something ...;
END;
既然要执行 DDL,请使用EXECUTE IMMEDIATE。
【讨论】: