Oracle 生成过程日志文件并插入日期时间

Oracle 生成过程日志文件并插入日期时间,oracle,procedure,log-files,Oracle,Procedure,Log Files,朋友们 DB:Oracle11gR2 操作系统:Linux 我用两个程序创建了包,程序执行alter table move,数据库上的索引重建命令 我在下面做什么 运行ksh shell脚本->执行过程 该过程在数据库上运行ALTERTABLE、rebuild index命令 程序完成 Shell脚本结束 我可以为shell脚本生成日志文件,但过程执行的任何内容都不会记录在shell脚本日志文件中。我理解,因为db会话是由过程创建的,所以它不会在shell日志文件中记录任何内容 那我怎么办 在日

朋友们

DB:Oracle11gR2

操作系统:Linux

我用两个程序创建了包,程序执行alter table move,数据库上的索引重建命令

我在下面做什么

  • 运行ksh shell脚本->执行过程
  • 该过程在数据库上运行ALTERTABLE、rebuild index命令
  • 程序完成
  • Shell脚本结束
  • 我可以为shell脚本生成日志文件,但过程执行的任何内容都不会记录在shell脚本日志文件中。我理解,因为db会话是由过程创建的,所以它不会在shell日志文件中记录任何内容

    那我怎么办

  • 在日志文件中记录由同一程序包中的两个程序执行的所有内容
  • 还试图将当前日期时间放在过程dmbs_out.put_行命令中吗
  • 是否可以在连接数据库一次后同时运行这两个过程,而不是两次连接数据库并执行过程
  • 可能存在表/表分区移动语法错误,但我仅尝试捕获表移动何时开始以及何时使用datetime完成,以便确定所花费的总时间

    *** ksh script
    #!/bin/ksh
    ...
    ...
    ...
    $LOG_FILE = move_tbs.log
    
    echo -e "set serveroutput on\n exec move_tbs.moveTable;"|$ORACLE_HOME/bin/sqlplus/@db_alias | head -l
    
    echo -e "set serveroutput on\n exec move_tbs.moveTablePart;"|$ORACLE_HOME/bin/sqlplus/@db_alias | head -l
    
    数据库包/程序

    *** Procedure
    create or replace package move_all
    
    procedure moveTable
    
    dbms_output.put_line("CURRENT TIME" 'alter table '|| owner || '.' || table_name || 'move');
    
    Execute immediate 'alter table '|| owner || '.' || table_name || 'move';
    dbms_output.put_line("COMPLETED TIME" : CURRENT_TIME);
    
    end moveTable;
    
    -------------------------------------------
    procedure moveTablePart
    
    dbms_output.put_line("CURRENT TIME" 'alter table '|| owner || '.' || table_name || 'move');
    
    Execute immediate 'alter table '|| owner || '.' || table_name || 'move partition';
    dbms_output.put_line("COMPLETED TIME" : CURRENT_TIME);
    
    end moveTablePart;
    end move_all
    /
    

    您可以将两个exec命令都放在echo构造中。但是,您可以使用来简化两者的同时运行,并且它也更易于阅读和维护。比如:

    LOG_TBS_MOVE=move_tbs.log
    
    (
    $ORACLE_HOME/bin/sqlplus -s -l user/passwd@db_alias <<!EOF
    set serveroutput on
    exec move_tbs.moveTable;
    exec move_tbs.moveTablePart;
    exit
    !EOF
    ) > $LOG_TBS_MOVE
    
    或者您可以在括号内显示shell中的时间;这也将进入同一个日志文件



    您尚未在SQL*Plus调用中显示用户名或密码;您可能只是隐藏了它们,但如果您是以SYS via/的身份连接的,则不应该在该模式中创建对象。创建一个新的模式并在其中工作。

    我正在使用tns别名连接到db。我将测试您的建议,并在这里提供结果。这是一种非常好的、干净的执行过程的方法,我的日常编程肯定会使用这种方法。创建日志文件失败,出现错误”第62行的语法错误:“@homer-那么您的herdeoc的开始和结束是不匹配的;它们是否都有
    !EOF
    ?它们需要完全相同。(连接是可选的,只是一种习惯;不管您使用什么值,它都必须是一致的)。尽管我已经验证了这一点,但我已经从问题中复制了日志文件分配。创建日志文件失败,出现错误”第62行的语法错误:'@homer-no,
    
    
    dbms_output.put_line(to_char(sysdate, 'HH24:MI:SS') ||
      'alter table '|| owner || '.' || table_name || 'move');
    
    dbms_output.put_line('COMPLETED TIME: ' || to_char(sysdate, 'HH24:MI:SS'));