我刚刚进入IBM i的PASE和Qshell世界,我仍在学习" shell方式"解决问题。
我正在尝试编写一个shell脚本,该脚本将删除给定库中与给定物理文件关联的所有逻辑文件。操作系统是IBM i 7.2。在QSYS-land中,我可能在物理文件上DSPDBR
到outfile,然后读取outfile并删除每个依赖文件。你会如何在PASE或Qshell中做到这一点?我有几个想法,但它们看起来都过于复杂,我对shell脚本的了解越多,我发现的捷径就越多。
我的第一个想法是基本上复制上面的过程,做这样的事情然后以某种方式使用SELECT的输出:
system "DSPDBR FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPDBR)"
db2 "select WHREFI from QTEMP/DSPDBR where WHRELI = 'MYLIB'"
(我现在看到QTEMP并不像真正的临时库那样工作,但也许可以解决这个问题。)
我的第二个想法是做一些事情,比如将DSPDBR语句的输出管道输入类似awk的东西来挑选逻辑文件名,并将其输出重定向到流文件(或shell变量?)。从那里,以某种方式使用此列表删除逻辑文件。
有更直接的方法吗?似乎无论答案是什么,它都是在编写shell脚本以与QSYS命令和对象交互时经常重复的模式。
答案 0 :(得分:1)
首先,您可以查看Running SQL queries from PASE instead of QSH。 db2实用程序是Qshell的一部分,而不是PASE。不幸的是,它背后的处理基于ILE,因此它不能在PASE(AIX运行时)环境中直接使用。链接的问题提供了一种在两者之间进行桥接的方法。
但是,直接在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或其他实用程序进行操作。
答案 1 :(得分:1)
QTEMP库特定于[作用域]在shell中实现请求的进程。确保依赖于同一QTEMP库的所有请求都将在同一进程中运行; system 实用程序在单独的进程中运行, db2 实用程序也是如此。例如,在QSHell的以下命令行调用中,所有依赖于QTEMP的请求将在 db2 实用程序运行的同一进程中运行; db2 实用程序运行一个脚本[或者可以运行一个动态复合语句],在这种情况下,它是由shell实用程序中的\的脚本化请求生成的:
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
')
答案 2 :(得分:1)
有一个等效的QShell db2命令的开源:https://bitbucket.org/litmis/db2util