我对 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')"
但需要处理第一个参数中的多个值。