2011-09-19 129 views
0

我在寻找提示如何控制大型sql脚本的执行。它将包含各种DDL和DML语句。大多数情况下,我一直在寻找DDL control.What实际上是什么意思是,基本上我有一个脚本与多个DDL语句,从我们的DB之一生成。当我启动脚本时,即使编译错误或创建错误,也会通过脚本。 Thx对于任何想法SQL脚本执行控制

+0

你是如何运行脚本? –

+0

它的oracle数据库,使用sqlplus(@ file.sql),因为这会更容易解决方案 – Mike

+0

请注意,根据脚本,如果以前的语句也有错误,某些语句将会出错。例如,如果基表不存在,通常不能创建索引和约束。反过来说,有些陈述是完整的(别名),这可能会让其他程序知道数据库的状态(由于新错误)根本不成立。 –

回答

2

想要在出错后退出吗?这里有几个例子。一定要检查文件WHENEVER SQLERROR

DDL(DML)例如:

prompt continues after error 
prompt ===================== 
prompt 

create table foo; 

prompt quits after error with error code 
prompt ================================= 
prompt 

whenever sqlerror exit sql.sqlcode 

create table foo; 

prompt never gets here 
prompt =============== 
prompt 

quit 

PL/SQL子程序引发了一个异常:

create or replace function foo return number as 
    foo_error exception; 
begin 
    raise foo_error; 
end; 
/
show errors 

prompt continues after error 
prompt ===================== 
prompt 

select foo from dual; 

prompt quits after error with error code 
prompt ================================= 
prompt 

whenever sqlerror exit sql.sqlcode 

select foo from dual; 

prompt never gets here 
prompt =============== 
prompt 

quit 

PL/SQL单元编译失败:

create or replace procedure compile_function (f in varchar2) as 
begin 
    execute immediate 'alter function :f compile' using f; 
exception 
    when others then 
    raise_application_error(-20000, 'Failed to compile function ' || f); 
end; 
/
show errors 

prompt continues after error 
prompt ===================== 
prompt 

create or replace function foo return number as 
begin 
    compilation will fail 
end; 
/
show errors 

exec compile_function('foo') 

prompt quits after error with error code 
prompt ================================= 
prompt 

whenever sqlerror exit sql.sqlcode 

create or replace function foo return number as 
begin 
    compilation will fail 
end; 
/
show errors 

exec compile_function('foo') 

prompt never gets here 
prompt =============== 
prompt 

quit