shell脚本需要读取一批行(先说150)。然后将这些值存储在变量中。在执行SQL之后,现在它应该从151到300读取。这样,它将以150个批量读取行并将其存储在变量中,直到读取32000行。
脚本看起来像
#!/bin/bash
t2val=$(cat /home/trnid | tr '\n' ',' | sed 's/,$//')
sqlplus -s <username>/<passwd>@dbname > /home/file << EOF
set echo on
set pagesize 0
set verify off
set lines 32000
set trimspool on
set feedback off
SELECT *
FROM <dbname>.<tablename1> tr
LEFT JOIN <tablename2> t2 ON t2.id2 = tr.id1
LEFT JOIN <tablename3> t3 ON t3.id2 = tr.id1
LEFT JOIN <tablename4> t4 ON t4.id2 = tr.id1
WHERE tr.TIMESTAMP > SYSDATE - 75 / 1440
AND tr.TIMESTAMP <= SYSDATE - 15 / 1440
and t2.value in ( "t2val")
order by timestamp;
exit;
EOF
trnid有32000行,每行包含11位数字。这里变量t2val有32000个以逗号分隔的值。但是脚本没有大的价值。因此,我需要将它除以少于2499个字符,因此从trnid文件中获取大约150个条目。我想以150的批量选择它们,然后将它放入t2val列(用逗号分隔),直到我达到第32000行。我想通过这种方式,如果你有想法获取列t2val的值&lt; 2499,请指教。或者按照我的想法帮助我(在SQL中执行150个条目的批处理)。
答案 0 :(得分:2)
看起来您将这些值存储在ORacle DB中。为什么不使用批量加载器?
另一种解决方案是使用perl
没有错误处理的伪代码:
open (FH, "<filename");
my $count = 0;
my $buffer = ();
while(<FH>) {
push($buffer,split);
$count++;
if($count % 150 == 0) {
saveToDB($buffer);
$buffer = ();
}
}
其中saveToDB可以轻松地将值存储在DB中,例如通过DBI
答案 1 :(得分:1)
选项1)
使用split
从/home/trnid
创建一组临时文件
然后在这些临时文件上迭代并cat
等。
(除非您不需要使用cat,只需重定向到tr
)
选项2)
使用head
和tail
依次获取文件的部分行,而不是使用cat。
选项3)
用适当的语言重写,以避免所有这些额外进程的开销。