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

时间:2014-08-21 20:50:30

标签: oracle procedure log-files

...好友

DB:Oracle11gR2

操作系统:Linux

我用几个程序创建了包,程序执行alter table move ...,在数据库上执行index rebuild命令。

我在下面

  1. 运行ksh shell脚本 - >执行程序
  2. 过程运行alter table,在数据库上重建索引命令
  3. 程序完成
  4. Shell脚本结束。
  5. 我可以为shell脚本生成日志文件,但是程序执行的任何内容都不会记录在shell脚本日志文件中。我理解,因为程序创建的db会话它不会在shell logfile中记录任何内容。

    那我怎么能

    1. 将日志文件中的所有内容记录在同一个程序包中的两个程序中执行?
    2. 还尝试将当前日期时间放在过程dmbs_out.put_line命令中?
    3. 连接数据库一次而不是2次连接数据库和执行程序后,是否可以运行这两个程序?
    4. 可能存在表/表分区移动语法错误,但我只是尝试在表移动开始时和当使用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
      /
      

1 个答案:

答案 0 :(得分:1)

您可以将两个exec命令放在echo构造中。但是你可以使用'heredoc'来简化两者的运行,并且它也更容易阅读和维护。类似的东西:

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

此示例!EOF中的herdoc开始和结束标记必须完全匹配。它们可以是你喜欢的任何东西,只要heredoc里面没有任何东西意外地结束它。并且结束标记必须位于一行的开头,它不能缩进。

SQL * Plus和heredoc周围的括号可以包含多个命令,其中的所有输出都会进入日志。它们在这里并不是必需的,因为里面只有一个命令,但我认为这是一种相当清晰的重定向方式。

我只是将stdout放入$LOG_TBS_MOVE文件中; stderr上的任何内容(不包括任何SQL错误)仍将转到屏幕或主日志,如果你重定向stderr。

要在输出中显示时间,请不要将current_time部分括在引号中,使用字符串连接,并使用正确的函数:

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'));

或者您可以在括号内显示来自shell的时间;然后它也会进入同一个日志文件。


您的SQL * Plus通话中未显示用户名或密码;你可能只是隐藏了它们,但如果你通过/连接为SYS,你真的不应该在该模式中创建对象。创建一个新架构并在其中工作。