Генерация лог файла процедуры и вставка даты и времени
Друзья...
БД: Oracle11gR2
ОС: Linux
Я создал пакет с несколькими процедурами, процедура выполняет изменение таблицы перемещения..., команда перестроения индекса на базе данных.
Я делаю ниже
- Запустить скрипт оболочки ksh -> выполнить процедуру
- Процедура запускает изменения таблицы, перестраивает индексные команды для базы данных.
- Процедура завершена
- Сценарий оболочки заканчивается.
Я могу сгенерировать файл журнала для сценария оболочки, но все, что выполняется процедурой, не записывается в файле журнала сценария оболочки. Я понял, так как сессия db, созданная процедурой, не будет ничего записывать в лог-файл оболочки.
Так как я могу
- Записать все в лог-файл, который выполняется обеими процедурами в одном пакете?
- Также пытаетесь поместить текущую дату и время в команду процедуры dmbs_out.put_line?
- Можно ли запустить обе процедуры после подключения базы данных один раз вместо двухкратного подключения базы данных и выполнения процедуры?
Может быть ошибка синтаксиса перемещения таблицы / раздела таблицы, но я пытаюсь отследить только, когда перемещение таблицы началось и когда закончилось с 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 через /, вам действительно не следует создавать объекты в этой схеме. Создайте новую схему и работайте в ней.