优化informix更新

时间:2017-04-27 20:48:32

标签: sql informix

我有一个bash脚本,它将根据文件更新表。我有它的方式它打开和关闭文件中的每一行,并想了解如何打开,执行所有更新,然后关闭。它适用于一些更新,但如果它需要超过几百个可能真的对系统造成负担。

header {
  border-bottom: 3px solid #800000;
  padding-top: 1.5em;
  padding-bottom: 0em;
  padding-left: 2em;

  background-color: grey;
}

源文件。

    #!/bin/bash

    file=/export/home/dncs/tmp/file.csv
    dateFormat=$(date +"%m-%d-%y-%T")
    LOGFILE=/export/home/dncs/tmp/Log_${dateFormat}.log

    echo "${dateFormat} : Starting work" >> $LOGFILE 2>&1

    while IFS="," read mac loc; do
      if [[ "$mac" =~ ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$ ]]; then


    dbaccess thedb <<EndOfUpdate >> $LOGFILE 2>&1
    UPDATE profile
    SET local_code= '$loc'
    WHERE mac_address = '$mac';
    EndOfUpdate
      else
    echo "Error: $mac not valid format" >> $LOGFILE 2>&1
    fi
    IIH -i $mac >> $LOGFILE 2>&1


    done <"$file"

1 个答案:

答案 0 :(得分:1)

这或多或少是我要做的事情:

#!/bin/bash

fmt_date() { date +"%Y-%m-%d.%T"; }

file=/export/home/dncs/tmp/file.csv
dateFormat=$(fmt_date)
LOGFILE="/export/home/dncs/tmp/Log_${dateFormat}.log"

exec >> $LOGFILE 2>&1

echo "${dateFormat} : Starting work"

valid_mac='/^\(\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}\),\([^,]*\)$/'
update_stmt="UPDATE profile SET local_code = '\3' WHERE mac_address = '\1';"

sed -n -e "$valid_mac s//$update_stmt/p" "$file" |
dbaccess thedb -

sed -n -e "$valid_mac d; s/.*/Error: invalid format: &/p" "$file"

sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | sh

echo "$(fmt_date) : Finished work"

我将日期格式更改为ISO 8601的变体;它更容易解析。如果您愿意,可以坚持使用符合Y2K标准的US-ish格式。 exec行从此处开始安排标准输出和标准错误以转到日志文件。 sed命令都使用相同的结构,并且都使用存储在变量中的相同模式匹配。这使得一致性更容易。第一个sed脚本将数据转换为UPDATE语句(提供给dbaccess)。第二个脚本标识无效的MAC地址;它删除有效的行并将无效行映射到错误消息中。第三个脚本忽略无效的MAC地址,但为每个有效的MAC地址生成IIH命令。该脚本记录结束时间 - 它将允许您评估处理所需的时间。同样,通过创建和使用fmt_date函数来避免重复。

小心测试这个。我有一个文件data,其中包含:

87:36:E6:5E:AC:41,loc-OYNK
B2:4D:65:70:32:26,loc-DQLO
ZD:D9:BA:34:FD:97,loc-PLBI
04:EB:71:0D:29:D0,loc-LMEE
DA:67:53:4B:EC:C4,loc-SFUU

我将dbaccess替换为cat,将sh替换为cat。我重新定位到当前目录的日志文件 - 导致:

#!/bin/bash

fmt_date() { date +"%Y-%m-%d.%T"; }

#file=/export/home/dncs/tmp/file.csv
file=data
dateFormat=$(fmt_date)
#LOGFILE="/export/home/dncs/tmp/Log_${dateFormat}.log"
LOGFILE="Log-${dateFormat}.log"

exec >> $LOGFILE 2>&1

echo "${dateFormat} : Starting work"

valid_mac='/^\(\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}\),\([^,]*\)$/'
update_stmt="UPDATE profile SET local_code = '\3' WHERE mac_address = '\1';"

sed -n -e "$valid_mac s//$update_stmt/p" "$file" |
cat
#dbaccess thedb -

sed -n -e "$valid_mac d; s/.*/Error: invalid format: &/p" "$file"

#sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | sh
sed -n -e "$valid_mac s//IIH -i \1/p" "$file" | cat

echo "$(fmt_date) : Finished work"

运行后,日志文件包含:

2017-04-27.14:58:20 : Starting work
UPDATE profile SET local_code = 'loc-OYNK' WHERE mac_address = '87:36:E6:5E:AC:41';
UPDATE profile SET local_code = 'loc-DQLO' WHERE mac_address = 'B2:4D:65:70:32:26';
UPDATE profile SET local_code = 'loc-LMEE' WHERE mac_address = '04:EB:71:0D:29:D0';
UPDATE profile SET local_code = 'loc-SFUU' WHERE mac_address = 'DA:67:53:4B:EC:C4';
Error: invalid format: ZD:D9:BA:34:FD:97,loc-PLBI
IIH -i 87:36:E6:5E:AC:41
IIH -i B2:4D:65:70:32:26
IIH -i 04:EB:71:0D:29:D0
IIH -i DA:67:53:4B:EC:C4
2017-04-27.14:58:20 : Finished work

UPDATE语句将转到DB-Access。识别出伪造的MAC地址。将运行正确的IIH命令。

请注意,将输出汇总到sh需要确保您生成的数据(IIH命令)是干净的。