2010-10-22 49 views
1

shell脚本需要读取批处理行(可以说前150行)。然后将该值存储在变量中。 SQL执行完毕后,现在应该从151读到300.这样,它将读取批量为150的行并将其存储在一个变量中,直到读取32000行。如何读取文件中的行,存储文件并再次从UNIX中的最后存储行开始

脚本如下所示

#!/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列的价值,请告知。或者按我想的方式帮助我(在SQL中执行150个条目的批处理)。

+0

精确副本[这个问题] (http://stackoverflow.com/questions/3994189/to-read-from-file-and-putting-values-in-where-clause-via-shell-script/3994334#3994334);你不喜欢我的sqlldr答案吗? – Benoit 2010-10-22 08:34:36

+0

@Benoit我喜欢你的sqlloader答案:-)唯一的问题是,我只在数据库上的用户级别工作。我没有管理员权限:-(所以,我在我的家庭驱动器上使用这些脚本,使用用户名和密码登录并运行它们。那么,你觉得我可以使用SQL加载器吗? – ErAB 2010-10-22 08:52:17

+0

Ashish,你有权利创建临时表?如果是这样,您仍然可以在该表中插入“插入”... – Benoit 2010-10-22 09:00:36

回答

1

选项1)

使用split/home/trnid 创建一组临时文件然后进行迭代,并在这些临时文件cat等。 (除非你不需要使用的猫,并且可以简单地重定向到tr

选项2)

使用headtail得到又将文件的行的部分,而不是使用猫, 。

选项3)

重写一个恰当的语言来避免所有这些额外的处理开销。

2

它看起来像你将这些值存储在ORACLE数据库中。为什么不使用散装装载机?

另一个解决方案是用perl

伪无错误处理:

open (FH, "<filename"); 
my $count = 0; 
my $buffer =(); 
while(<FH>) { 
    push($buffer,split); 
    $count++; 
    if($count % 150 == 0) { 
    saveToDB($buffer); 
    $buffer =(); 
    } 
} 

其中saveToDB可以easyily存储在DB中的值,例如通过DBI

相关问题