Генерация лог файла процедуры и вставка даты и времени

Друзья...

БД: Oracle11gR2

ОС: Linux

Я создал пакет с несколькими процедурами, процедура выполняет изменение таблицы перемещения..., команда перестроения индекса на базе данных.

Я делаю ниже

  1. Запустить скрипт оболочки ksh -> выполнить процедуру
  2. Процедура запускает изменения таблицы, перестраивает индексные команды для базы данных.
  3. Процедура завершена
  4. Сценарий оболочки заканчивается.

Я могу сгенерировать файл журнала для сценария оболочки, но все, что выполняется процедурой, не записывается в файле журнала сценария оболочки. Я понял, так как сессия db, созданная процедурой, не будет ничего записывать в лог-файл оболочки.

Так как я могу

  1. Записать все в лог-файл, который выполняется обеими процедурами в одном пакете?
  2. Также пытаетесь поместить текущую дату и время в команду процедуры dmbs_out.put_line?
  3. Можно ли запустить обе процедуры после подключения базы данных один раз вместо двухкратного подключения базы данных и выполнения процедуры?

Может быть ошибка синтаксиса перемещения таблицы / раздела таблицы, но я пытаюсь отследить только, когда перемещение таблицы началось и когда закончилось с 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 ответ

Решение

Вы можете просто поместить обе команды exec в вашу эхо-конструкцию. Но вы можете использовать "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 - должны точно соответствовать. Это может быть все, что угодно, если только у вас нет никаких шансов на то, что внутри наследственного шока это случайно прекратится. И маркер конца должен быть в начале строки, он не может иметь отступ.

Скобки вокруг SQL*Plus и heredoc могут содержать многозадачные команды, и весь вывод из них поступает в журнал. Здесь они на самом деле не нужны, так как внутри всего одна команда, но я думаю, что это довольно четкий способ перенаправления.

Я только кладу стандартный вывод в $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'));

Или вместо этого вы можете отобразить время из оболочки в скобках; это также затем войдет в тот же файл журнала.


Вы не указали имя пользователя или пароль в своих вызовах SQL*Plus; вы, вероятно, просто скрыли их, но если вы подключаетесь как SYS через /, вам действительно не следует создавать объекты в этой схеме. Создайте новую схему и работайте в ней.

Другие вопросы по тегам