作为构建过程的一部分,我们希望针对新的数据库实例执行由DDL和DML语句组成的SQL Scripts。
如果不解析和拆分脚本,ADO.NET Connection / Command无法处理此问题。
sqlplus
命令行实用程序只能以交互方式执行脚本,不适合批量使用。
我错过了什么?如何在使用oracle时执行sql脚本?
答案 0 :(得分:2)
为什么您认为SQL Plus实用程序不适合批量使用?使用它来运行这些类型的脚本是很常见的 - 如果您愿意,可以在调用它时将脚本传递给SQL Plus,即
sqlplus scott/tiger@someDatabase @someScript.sql
这是部署构建的一种非常常见的方式。
如果问题与SQL * Plus处理错误的方式有关,您只需添加行
即可WHENEVER SQLERROR EXIT SQL.SQLCODE
中止并抛出遇到的Oracle错误号。 WHENEVER SQLERROR command的文档也提供了许多其他选项。
答案 1 :(得分:2)
Devdimi,
我同意Erik K.
是的,您可以在匿名块中包含DDL。
DECLARE
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE foo';
END;
记住DDL在运行之前及之后进行提交。因此,作为交易的一部分,它有点糟糕。
答案 2 :(得分:1)
如果您将语句包装在DECLARE / BEGIN / END中,我认为您可以这样做。我不再访问Oracle了,所以我无法测试它。 例如:
DECLARE
BEGIN
INSERT INTO ...;
UPDATE something ...;
END;
由于您要执行DDL,请使用EXECUTE IMMEDIATE
。