通过迭代前一个查询的结果来执行数据库查询

通过迭代前一个查询的结果来执行数据库查询

我对 Unix 和 bash 脚本很陌生,所以如果这是一个愚蠢的问题,请告诉我。

我刚刚开始在一家使用 Unix 平台上托管的 DB2 的公司工作,他们的数据库(由 IBM Design studio 创建)中有很多不需要的模式。我想清理这些模式,并且我假设 bash 脚本是最好的方法。

我想做的是查询数据库以获取模式名称并将它们存储在某种集合中;然后遍历集合,对每个名称执行 drop 命令。

我对 DB2 命令没问题(我认为),但我不清楚如何在脚本中获取结果。

这将检索有问题的模式名称:

db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'"

这将删除名称已分配给变量 $SCHEMA_TO_DROP 的架构:

db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

我现在需要做的就是将两者链接在一起,但不确定从哪里开始?

答案1

您可以将选择输出分配给变量,然后使用 for 循环迭代每个 schema_name。

/usr/bin/ksh

# Assign the output of the SELECT command to a local shell variable
SCHEMA_DROP_LIST=$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")

# Loop over each schema_name
for SCHEMA_TO_DROP in $SCHEMA_DROP_LIST
do
     # Drop the schema, 1 at a time
     db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

done

您还可以使用 $?紧随 db2 drop 命令之后的变量来捕获返回代码,然后根据该返回代码采取操作(回显错误代码、退出等)。

答案2

# POSIX shell: command substitution, bash.info 3.5.4
# Sets SCHEMA_TO_DROP to the output of balh blah..
SCHEMA_TO_DROP="$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")"
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"

更新:

就像 visudo 提到的那样,SCHEMA_TO_DROP捕获的实际上是一个列表。您可以使用循环for var in balh list来遍历列表。

使用$?可能是不必要的。就我个人而言,我更喜欢像||and这样的逻辑运算&&

IFS='\n' # make sure that for don't split anything other then newlines
for foo in $SCHEMA_TO_DROP; do
    db2 something something || oh_crap_it_failed
done

答案3

您是否尝试过使用子查询?它可能看起来像这样:

db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA((SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'), NULL, 'ST', 'ErrorTable')"

但需要处理第一个参数中的多个值。

相关内容