Oracle 如何从批处理文件生成sql脚本运行日志

Oracle 如何从批处理文件生成sql脚本运行日志,oracle,batch-file,sql-delete,logfile,Oracle,Batch File,Sql Delete,Logfile,我已删除以下运行良好的_import.bat文件,该文件包含以下内容: sqlplus @C:\Exp_Imp_Util\delete_tmc.sql deletetmc.sql文件包含我要删除的所有数据库对象。但现在每当我运行批处理文件时,它都应该创建所有delete语句的日志,并且如果在删除sql语句时发生任何oracle错误,它也应该写入日志文件 CONNECT TMC/TMC; spool off declare stringa varchar2(100); cursor cur i

我已删除以下运行良好的_import.bat文件,该文件包含以下内容:

sqlplus @C:\Exp_Imp_Util\delete_tmc.sql
deletetmc.sql文件包含我要删除的所有数据库对象。但现在每当我运行批处理文件时,它都应该创建所有delete语句的日志,并且如果在删除sql语句时发生任何oracle错误,它也应该写入日志文件

CONNECT TMC/TMC;
spool off
declare
stringa varchar2(100);

cursor cur is
select *
from user_objects;

begin
for c in cur loop
begin
stringa := '';

if c.object_type = 'VIEW' then

stringa := 'drop view ' || c.object_name;
EXECUTE immediate stringa; 

elsif c.object_type = 'TABLE' then

stringa := 'drop table ' || c.object_name || ' cascade constraints'; 
EXECUTE immediate stringa; 

elsif c.object_type = 'SEQUENCE' then

stringa := 'drop sequence ' || c.object_name; 
EXECUTE immediate stringa; 
elsif c.object_type = 'PACKAGE' then

stringa := 'drop package ' || c.object_name; 
EXECUTE immediate stringa;      

elsif c.object_type = 'TRIGGER' then

stringa := 'drop trigger ' || c.object_name; 
EXECUTE immediate stringa;      

elsif c.object_type = 'PROCEDURE' then

stringa := 'drop procedure ' || c.object_name; 
EXECUTE immediate stringa; 

elsif c.object_type = 'FUNCTION' then

stringa := 'drop function ' || c.object_name; 
EXECUTE immediate stringa;      
elsif c.object_type = 'SYNONYM' then

stringa := 'drop synonym ' || c.object_name; 
EXECUTE immediate stringa; 
elsif c.object_type = 'INDEX' then

stringa := 'drop index ' || c.object_name; 
EXECUTE immediate stringa; 
elsif c.object_type = 'PACKAGE BODY' then

stringa := 'drop PACKAGE BODY ' || c.object_name; 
EXECUTE immediate stringa;      

end if;

     exception
when others then
null;
end; 
end loop;
-- PURGE recyclebin

end;
/
EXIT;

您可以设置
SPOOL
写入文件,然后使用
DBMS\u输出

script.sql

spool spool.txt
set serveroutput on
declare
    vSQL varchar2(1000);
begin
    vSQL := 'create table tab1 ( a number)';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;

    vSQL := 'drop table tab1';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;

    vSQL := 'drop table tab1';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;
end;
/   
spool off 
运行脚本后,文件spool.txt将为:

OK - create table tab1 ( a number)                                              
OK - drop table tab1                                                            
KO - drop table tab1 - ORA-00942: table or view does not exist                  

PL/SQL procedure successfully completed.

您可以设置
SPOOL
写入文件,然后使用
DBMS\u输出

script.sql

spool spool.txt
set serveroutput on
declare
    vSQL varchar2(1000);
begin
    vSQL := 'create table tab1 ( a number)';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;

    vSQL := 'drop table tab1';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;

    vSQL := 'drop table tab1';
    begin
        execute immediate vSQL;
        dbms_output.put_line('OK - ' || vSQL);
    exception
    when others then
        dbms_output.put_line('KO - ' || vSQL || ' - ' || sqlerrm);        
    end;
end;
/   
spool off 
运行脚本后,文件spool.txt将为:

OK - create table tab1 ( a number)                                              
OK - drop table tab1                                                            
KO - drop table tab1 - ORA-00942: table or view does not exist                  

PL/SQL procedure successfully completed.

我试过了,但在日志文件中显示为已连接。为了进行测试,我创建了一个表,并试图从这个批处理文件中删除它。该表已删除,但在日志文件中其写入已连接。没有关于哪张桌子掉了的信息。也许你把控制柜放错地方了;尝试在任何其他语句之前移动它。我尝试过,但在日志文件中,它显示为已连接。为了进行测试,我创建了一个表,并试图从这个批处理文件中删除它。该表已删除,但在日志文件中其写入已连接。没有关于哪张桌子掉了的信息。也许你把控制柜放错地方了;尝试将其移到任何其他语句之前