我刚刚进入IBM上的PASE和Qshell的世界,还在学习解决问题的"shell方式“。
我正在尝试编写一个shell脚本,该脚本将删除给定库中与给定物理文件相关联的所有逻辑文件。操作系统是IBM i 7.2。在QSYS-land中,我可能会将物理文件DSPDBR到输出文件,然后读取输出文件并删除每个相关文件。你将如何在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命令和对象交互时,它都将是一个经常重复的模式。
发布于 2016-07-09 12:05:34
首先,您可以回顾一下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()函数可能有用,也可能没用。这取决于你的名字长度,以及你是否想要限制他们。输出可以重定向到输出文件,也可以通过管道传输到sed或其他实用程序中进行操作。
发布于 2016-07-12 00:34:00
特定于的QTEMP库的作用域是在shell中实现请求的进程。确保依赖于同一QTEMP库的所有请求都将在同一进程中运行;系统实用程序和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
') 发布于 2016-08-03 04:55:07
有一个与QShell db2命令等效的开源命令:https://bitbucket.org/litmis/db2util
https://stackoverflow.com/questions/38276689
复制相似问题