4

OracleDBから単一のフィールドを返す単純なシェル関数を作成する必要があります。たとえばそれを考えてみてください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')をシェル変数にパイプ処理したいのですが、この変数は関数が返し、他のシェルスクリプトから呼び出すことができます。残念ながら、sqlplusは、上部に「Welcome to Oracle」、下部に「Disconnected ...」など、大量のガベージを返します。

SQL結果セットからデータだけを抽出する方法、またはこの場合は単一の値をUNIX変数に渡して、シェル内でさらに操作する方法を教えてください。

ありがとう

4

2 に答える 2

3

このaskTomスレッドには、SQL*Plusからシェルスクリプトに値を返す際のいくつかの異なるアプローチがあります。

一般的なアプローチの1つは、返したい値(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

ジャスティンの答え(これは素晴らしい)に基づいて、1つの数字(またはトークン)を選択するだけでよい場合、これは少し短く、しかも読みやすいバージョンだと思います。

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