【问题标题】:unix ksh retrieve oracle query resultunix ksh 检索 oracle 查询结果
【发布时间】:2011-02-02 01:25:32
【问题描述】:

我正在为一个简单的任务编写一小段 ksh 代码。 我需要从一个表中检索大约 1400 万行,然后使用这些信息生成一个 xml 文件。我对信息没有任何处理,只有一些“如果”。 问题是写文件大约需要 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 次访问文件。 它仍然很长,所以不是写作而是循环遍历结果。

有人知道如何改进它吗?

【问题讨论】:

    标签: oracle unix shell ksh


    【解决方案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"
       }
    }'  
    

    根据需要使用&gt;&gt;&gt; 将上述内容重定向到新文件

    【讨论】:

    • 这个解决方案不错,但我里面会有一些 IF,所以如果我没记错的话,我不能把它放在 awk 里面。
    • 当然可以。 awk 是一种编程语言,所以它也有循环和流控制。查看我的编辑。
    【解决方案2】:

    我怀疑这是将数据转储到 xml 文件的最有效方式。你可以尝试使用 groovy 来完成这样的任务。在 -> http://groovy.codehaus.org/Convert+SQL+Result+To+XML

    中查看 groovy 食谱

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您也许可以消除对 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]}
        

        【讨论】:

        • 但这适用于大量数据吗?大概有 1400 万行?
        • 它可以像现在这样使用 awk 一样有效,但可以节省重复生成额外进程的成本。这六行将替换您在问题中显示的循环中的两个分配。如果ctl_data 接收所有 1400 万行作为其值,那么这就是您的问题所在。如果是这样,那么其他解决方案之一可能会更好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多