2010-03-29 89 views
1

我正在为简单的任务处理一小段ksh代码。 我需要从表中检索大约1400万行,然后使用这些信息生成一个xml文件。我对这些信息没有任何处理,只有一些“IF”。 问题是编写文件需要大约30分钟,这对我来说是不可接受的。unix ksh检索oracle查询结果

这是一块Ø代码:

...... 
query="select field1||','||field2||' from table1" 
ctl_data=`sqlplus -L -s $ORA_CONNECT @$REQUEST` 

for variable in ${ctl_data} 
do 

VAR1 = echo ${variable} | awk -F, '{ print $1 }'

VAR2 = echo ${variable} | awk -F, '{ print $2 }'

  ....... write into the file ...... 

对于加快我只写东西30行文件,所以更多的东西在一行,所以我只有30个将文件夹到文件中。 它仍然很长,所以不是写作,而是循环遍历结果。

任何人都有一个关于如何改善它的ideea?

回答

1

您可能能够消除AWK来电:

saveIFS="$IFS" 
IFS=, 
array=($variable) 
IFS="$saveIFS" 
var1=${array[0]} # or just use the array's elements in place of var1 and var2 
var2=${array[1]} 
+0

但是这是否适用于大量数据?大概有1400万行吗? – 2010-03-30 09:28:16

+0

它可以像现在一样使用awk,但会节省重复产生额外进程的成本。这六条线将取代您在问题中显示的循环中的两个作业。如果'ctl_data'收到所有1400万行的值,那么这就是你的问题所在。如果是这样,那么其他解决方案可能会更好。 – 2010-03-30 11:19:39

1

您可以使用一个实例减少对awk的调用量。例如

query="select codtit||','||crsspt||' from table1" 
..... 
sqlplus -L -s $ORA_CONNECT @$REQUEST | awk -F"," 'BEGIN{ 
    print "xml headers here..." 
} 
{ 
    # generate xml here.. 
    print "<tag1>variable 1 is "$1"</tag1>" 
    print "<tag2>variable 2 is "$2" and so on..</tag2>" 
    if (some condition here is true){ 
     print "do something here" 
    } 
}' 

重定向以上使用>>>

+0

不坏这个解决方案,但我会有一些IF内,所以如果我没有错,我不能把它里面的awk。 – 2010-03-29 15:18:06

+0

确定你可以。 awk是一种编程语言,所以它也有循环和流量控制。看我的编辑。 – ghostdog74 2010-03-29 16:19:08

2

而不是从oracle传递到ksh你可以在oracle中完成这一切吗? 您可以使用以下格式将输出格式化为xml。

select xmlgen.getxml('select field1,field2 from table1') from dual;