2016-07-08 1 views
0

Я просто вступаю в мир PASE и Qshell на IBM i, и я все еще изучаю «оболочный путь» решения проблем.Как определить отношения базы данных с PASE/Qshell?

Я пытаюсь написать сценарий оболочки, который удалит все логические файлы в данной библиотеке, которые связаны с данным физическим файлом. ОС - IBM i 7.2. В QSYS-land я бы, вероятно, DSPDBR в физическом файле в outfile, затем прочитал outfile и удалил каждый зависимый файл. Как вы это сделаете на PASE или Qshell? У меня было несколько идей, но все они кажутся слишком сложными, и чем больше я узнаю о сценариях оболочки, тем больше ярлыков я нахожу.

Моя первая идея состояла в том, чтобы в основном повторить описанный выше процесс, делая что-то вроде этого, а затем каким-то образом, используя выход SELECT:

system "DSPDBR FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPDBR)" 
db2 "select WHREFI from QTEMP/DSPDBR where WHRELI = 'MYLIB'" 

(теперь я вижу, что QTEMP действительно не работает в качестве временного библиотека, но, возможно, есть способ обойти это.)

Моя вторая идея заключалась в том, чтобы сделать что-то вроде вывода вывода инструкции DSPDBR в нечто вроде awk, чтобы выбрать логические имена файлов и перенаправить вывод этого на файл потока (или переменная оболочки?). И оттуда, как-то использовать этот список для удаления логических файлов.

Есть ли более простой подход? Кажется, что бы ни был ответ, это будет шаблон, который часто повторяется при написании сценариев оболочки для взаимодействия с командами и объектами QSYS.

ответ

1

Во-первых, вы можете ознакомиться с Running SQL queries from PASE instead of QSH. Утилита db2 является частью Qshell, а не PASE. К сожалению, обработка позади него основана на ILE, поэтому она не может использоваться непосредственно в среде PASE (AIX run-time). Связанный вопрос предоставляет метод соединения между ними.

Однако непосредственно в Qshell, вы можете экспериментировать с чем-то вроде этого:

db2 "SELECT substr(VIEW_NAME,1,18), substr(OBJECT_NAME,1,10), 
     substr(OBJECT_SCHEMA,1,10), substr(VIEW_SCHEMA,1,10), 
     substr(TABLE_NAME,1,18) 
FROM qsys2.sysviewdep 
WHERE OBJECT_SCHEMA = '<yourSchemaName>'" 

В SUBSTR() функции может или не может быть полезным. Это зависит от ваших длин имен и того, хотите ли вы их ограничить или нет. Выход может быть перенаправлен в outfile или, возможно, перенаправлен в sed или другую утилиту для манипуляций.

+0

QSYS2.SYSVIEWDEP по-видимому не содержит мои тестовые PF и LF. Может быть, LF считаются индексами и поэтому не включены в SYSVIEWDEP? – smeep

+0

Я думаю, что я больше ищу, это общий шаблон, который люди используют при написании сценариев оболочки на i, которые должны взаимодействовать с командами/программами QSYS.В моем сценарии LF выше, мне интересно, какой правильный способ получить список LF для данного PF. Должен ли сценарий вызвать программу, которую я пишу в QSYS, чтобы получить список? Должен ли он разбирать выходные данные команды DSPDBR? Должен ли он работать с выходным файлом, созданным DSPDBR? При попытке манипулировать объектами QSYS и получать метаданные о них изнутри оболочки, какие общие шаблоны используют люди? – smeep

+0

@smeep Можете ли вы изменить свой вопрос, чтобы прояснить эти последние бит? (Комментарии могут быть временными.) Вас больше интересует PASE? QShell относительно хорошо интегрирован с ОС, в то время как PASE может потребовать более специфического программирования для репликации или доступа к функциям IBM i в течение времени выполнения AIX. – user2338816

1

Библиотека QTEMP специфична для [имеет область действия] для процесса, реализующего запрос в оболочке. Убедитесь, что все запросы, зависящие от одной и той же библиотеки QTEMP, будут выполняться в одном и том же процессе; система Утилита запускается в отдельном процессе, как и утилита db2. Например, в следующем вызове командной строки QSHell все запросы, зависящие от QTEMP, будут выполняться в том же процессе, в котором запускается служебная программа db2; db2 утилита запускает скрипт [или вместо может запустить динамический составной оператор], что в этом случае была порождена скриптовых запросов на \ внутри утилиты оболочки:

qsh cmd('                 
    echo "call qsys2.qcmdexc             
      (''dspdbr mylib/myfile output(*outfile) outfile(qtemp/dspdbr)'') 
     " >> mydb2.script             
; echo "select WHREFI from QTEMP.DSPDBR where WHRELI =''MYLIB''   
     " >> mydb2.script             
; db2 -f mydb2.script             
; rm  mydb2.script             
     ')                 
+0

Является ли здесь ключ qsys2.qcmdexc - в отличие от 'system' - работает в родительском процессе (в данном случае' db2'), и поэтому оператор select видит ту же библиотеку QTEMP, что и DSPDBR? – smeep

+0

Исправить; хранимая процедура CALL выполняется синхронно в том же процессе, что и предыдущие и последующие сценарии. Все запрошенные скрипты в одном вызове 'db2' будут запускаться в отдельном процессе, который был запущен для этого вызова' db2', для которого, как и для всех процессов, эта библиотека QTEMP будет сохраняться до тех пор, пока процесс не завершится, запросы, которые выполняются в этом процессе. – CRPence

Смежные вопросы