unix ksh检索oracle查询结果

时间:2010-03-29 13:51:45

标签: oracle unix shell ksh

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

这是一段代码:

......
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个访问文件。 它仍然很长,所以不是写作而是循环结果。

任何人都有关于如何改进它的想法?

4 个答案:

答案 0 :(得分:2)

你可以在oracle中完成所有操作,而不是从oracle传递给ksh吗? 您可以使用以下内容将输出格式化为xml。

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

答案 1 :(得分: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"
   }
}'  

根据需要使用>>>

将上述内容重定向到新文件

答案 2 :(得分: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]}

答案 3 :(得分:-1)

我怀疑,这是将数据转储到xml文件的最有效方法。你可以尝试使用groovy来完成这样的任务。看看 - &gt;中的常规食谱http://groovy.codehaus.org/Convert+SQL+Result+To+XML