如何从PASE / Qshell确定数据库关系?

时间:2016-07-08 23:24:34

标签: shell ksh ibm-midrange

我刚刚进入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命令和对象交互时经常重复的模式。

3 个答案:

答案 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