powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL*Plus save/restore column settings
3 сообщений из 3, страница 1 из 1
SQL*Plus save/restore column settings
    #39388071
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблематика такая: есть определенное кол-во скриптов, которые что-то устанавливают из настроек SQL*Plus, меняют. Я исторически использую доработанные save/restore sqlplus_settings от Steve Adams. Но сейчас хочу пойти дальше и сохранять еще настройки колонок, чтобы восстанавливать их установки в изначальное состояние после запусков скриптов из моих библиотек.

Собственно, я уже набросал 2 скрипта:
1. save (my_cpid - идентификатор клиентского процесса, awk/mv - у меня одна платформа и один рабочий каталог)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
set term off
spo sqlplus_column_settings_&my_cpid..sql
col
spo off

ho awk -vRS="" -vFS="\n" -vOFS=" " '{$1=$1; print }' sqlplus_column_settings_&my_cpid..sql > sqlplus_column_settings_&my_cpid..sql.1
ho mv sqlplus_column_settings_&my_cpid..sql.1 sqlplus_column_settings_&my_cpid..sql


2. restore
Код: plsql
1.
2.
cle col
@sqlplus_column_settings_&my_cpid..sql


Хочется еще посмотреть, что комьюнити в этой связи сделало, возможно, я что-то упустил из виду.
Делал кто что подобное?
...
Рейтинг: 0 / 0
SQL*Plus save/restore column settings
    #39388087
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGateвозможно, я что-то упустил из виду.Настройки спулинга :)
...
Рейтинг: 0 / 0
SQL*Plus save/restore column settings
    #39389408
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Спасибо :) не учел spool.
Пока я остановился на вот таком варианте:
save:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
set echo off esc on term off 

def my_spool_set="sqlplus_spool_settings_&my_cpid..sql"
def my_col_set="sqlplus_column_settings_&my_cpid..sql"

ho FILE="&my_spool_set." ; [ -f "$FILE" ] \&\& rm "$FILE" ; lsof -a -d 1-999 -p &my_cpid. | -
   awk -vre=$HOME"/[^.]*\.lst" '$5=="REG" \&\& $0~re {print "spool "$NF" append"} END {print ""}' 2>/dev/null -
     > "$FILE"

spo &my_col_set. rep
col
spo off

ho awk -vRS="" -vFS="\\n" -vOFS=" " '{$1=$1; print }' "&my_col_set." > "&my_col_set.".1 \&\& -
   mv "&my_col_set.".1 "&my_col_set."

@&my_spool_set.

ho &_delete. "&my_spool_set."


Собственно, тут я предпринимаю попытку достать spool file следующим образом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- Возможно, предыдущий запуск моих скриптов завершился с ошибкой.
-- Поэтому всегда пробуем удалить файл с настройкой spool на этом шаге,
-- т.к. иначе можем получить spool не нашего процесса и включить spool, когда он был отключен.
ho FILE="&my_spool_set." ; [ -f "$FILE" ] \&\& rm "$FILE" ; 
-- просматриваем файловые дескрипторы из этого диапазона. 
lsof -a -d 1-999 -p &my_cpid. | -
-- в заданном расположении по маске, чтобы не перезаписать "не тот" файл.
awk -vre=$HOME"/[^.]*\.lst" '$5=="REG" \&\& $0~re {print "spool "$NF" append"}
-- spool-а может не быть. Поэтому просто добавим пустую строку, чтобы awk гарантированно создал файл, который мы безусловно запустим.
END {print ""}' 2>/dev/null -
     > "$FILE"
...
-- безусловно пытаюсь вернуть настройки spool-а в то состояние, что были до захода в мой скрипт, сохраняющий колонки.
-- в этом скрипте либо пустая строка, либо spool <file> append.
@&my_spool_set.



restore:
Код: plsql
1.
2.
3.
4.
5.
cle col

@sqlplus_column_settings_&my_cpid..sql

ho &_delete. sqlplus_column_settings_&my_cpid..sql


В моих сценариях возможны следующие комбинации spool-ов:
№spool выполняется в сессии SQL*Plusspool выполняется в вызываемом скрипте1нетда2нетнет3дада4данет
Большей уровни вложенности spool-ов я не использую.
Варианты 1-2 можно не рассматривать, т.к. в этом случае spool в скрипте сохранения columns не вызывает сторонних эффектов по spool-у.
В варианте 3 я, не зависимо от своего скрипта сохранения колонок с его spool-ом, всегда получаю обрезанный spool верхнего уровня. Обрежется он в скрипте сохранения колонок или дальше, мне не важно.
Вариант 4 я проверил на ряде своих скриптов и модельных.
Результат удовлетворительный.

Скрипт верхнего уровня, эмулирующий сессию SQL*Plus:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set timi off ti off sqlp "SQL> " feed on
--set echo on

def spool_file="spool_test_savecol_wo_nested_spool"
spo &spool_file.
pro spool_test echo 1

col x for a10 hea MY_X_COL jus l fold_a nopri

--@@nested_wo_spool_nosavecol
@@nested_wo_spool_savecol
--@@nested_with_spool

pro spool_test echo 2

spo off

pro -- COL X

col x

pro -- CAT SPOOL

!cat &spool_file..lst


nested_wo_spool_nosavecol.sql:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--@savecolset
--spo nested_script
pro nested_script echo
col x cle
col x for a30
select 'SELECT_OUTPUT_FROM_NESTED' x from dual;
--spo off
--@loadcolset
set term on


nested_wo_spool_savecol.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
@savecolset
--spo nested_script
pro nested_script echo
col x cle
col x for a30
select 'SELECT_OUTPUT_FROM_NESTED' x from dual;
--spo off
@loadcolset
set term on


Последние команды мастер-скрипта без сохранения колонок (видим, что формат колонки был перезаписан во вложенном скрипте):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- COL X
COLUMN   x ON
FORMAT   a30
-- CAT SPOOL
spool_test echo 1
nested_script echo

X
------------------------------
SELECT_OUTPUT_FROM_NESTED

1 row selected.

spool_test echo 2


С сохранением (видим сохранившийся format колонки из скрипта верхнего уровня, spool без единого разрыва):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
-- COL X
COLUMN   x ON
HEADING  'MY_X_COL'
FORMAT   a10
FOLD_AFTER 1 JUSTIFY left NOPRINT 
-- CAT SPOOL
spool_test echo 1


nested_script echo

X
------------------------------
SELECT_OUTPUT_FROM_NESTED

1 row selected.


spool_test echo 2



Пока не вижу, что-то кардинально проще такому решению. Возможно, в sqlcl с его возможностью написания скриптов на Java Script это проще, но пост не про него.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL*Plus save/restore column settings
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]