0

朋友们...

数据库:Oracle11gR2

操作系统:Linux

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

我在下面做

  1. 运行 ksh shell 脚本 -> 执行过程
  2. 程序运行alter table,在数据库上重建索引命令
  3. 程序完成
  4. Shell 脚本结束。

我可以为 shell 脚本生成日志文件,但是程序执行的任何内容都不会记录在 shell 脚本日志文件中。我明白,由于过程创建的 db 会话它不会在 shell 日志文件中记录任何内容。

那我怎么能

  1. 将两个程序在同一个包中执行的所有内容记录在日志文件中?
  2. 还试图将当前日期时间放在过程 dmbs_out.put_line 命令中?
  3. 是否可以在连接数据库一次而不是两次连接数据库并执行程序后运行这两个程序?

可能存在表/表分区移动语法错误,但我只是试图捕获表移动何时开始以及何时完成日期时间,以便确定总时间。

*** 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
/
4

1 回答 1

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

此示例中的 herdoc 开始和结束标记!EOF- 必须完全匹配。它们可以是你喜欢的任何东西,只要heredoc 中的任何东西都不会意外结束它。并且结束标记必须在行首,不能缩进。

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

我只是将标准输出放入$LOG_TBS_MOVE文件中;如果您为此重定向 stderr,则 stderr 上的任何内容(不包括任何 SQL 错误)仍将进入屏幕或主日志。

要在输出中显示时间,请不要将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 身份连接,您真的不应该在该模式中创建对象。创建一个新模式并在其中工作。

于 2014-08-21T23:09:08.367 回答