4

我需要编写一个简单的 shell 函数,从 Oracle DB 中返回单个字段。把它想象成例子SELECT 'ABC' FROM dual;,ABC就是我所追求的。

这是我的功能:

function getSomeOraVal
{
sqlplus $USER/$PASSWD@$ORADB<<!!

SET sqlprompt '' 
SET sqlnumber off 

SET verify off
SET pages 0
SET echo off
SET head on
SET feedback off
SET feed off
SET serveroutput on
SET escape '\'

VARIABLE  v_someVal VARCHAR2(30);

BEGIN
SELECT 'ABC' INTO v_someVal FROM dual;
END;
/

SELECT :v_someVal FROM dual;

!!
}

但是,我想将 sqlplus 输出(仅数据 -> 'ABC')通过管道传输到一个 shell 变量中,然后该函数返回该变量并可以从其他 shell 脚本中调用。不幸的是,sqlplus 返回一大堆垃圾,例如顶部的“Welcome to Oracle”和底部的“Disconnected...”。

如何从 SQL 结果集中提取数据,或者在这种情况下提取单个值并将其传递给 UNIX 变量,以便在 shell 中进行进一步操作?

谢谢

4

2 回答 2

3

在这个 askTom 线程中有几种不同的方法将值从 SQL*Plus 返回到 shell 脚本

一种常见的方法是除了要返回的值之外选择一个常量标记(在 Tom 的示例中,即字符串“KEEP”),然后使用 sed(或您最喜欢的命令行解析器)来提取数据'实际上对

#!/bin/ksh

x=`sqlplus / <<endl | grep KEEP | sed 's/KEEP//;s/[   ]//g'
select 'KEEP' , max(sal) from emp;
exit
endl`

echo the answer is $x

该线程还讨论了 其他方法,例如允许您读取多行输出的方法。

如果您不希望打印标题,则应指定

set head off

在您的 SQL*Plus 脚本中 - 如果您不想要标题,我不确定您为什么要在脚本中显式设置标题...您想保留标题的某些部分吗?

于 2012-10-23T20:54:25.877 回答
1

根据贾斯汀的回答(这很好),当您只需要选择一个数字(或令牌)时,我认为这个版本更短但更易读:

x=`sqlplus -S / <<< "select 'KEEP' , max(sal) from emp;" | awk '/KEEP/{print $2}'`
于 2014-10-06T13:39:44.950 回答