2016-09-05 6 views
-2

誰かがbashスクリプトからSQLクエリを実行する方法の例を教えてもらえますか? Stack Overflowで検索しましたが、私にとってうまくいく答えが見つかりませんでした。私は前が、psqlのために、このようなものを作ったのだが、このように見えた:状況は、私は自分のサーバー上でだとき、私は、データベースから何かを選択するために、ラインのこれらのセットを記述する必要があり、このようなものですbash内からSQLコマンドを実行する

psql -U userName -c "SELECT * FROM table;" 

su - oracle; 
    //insert password for oracle user 
    sqlplus /nolog; 
    connect/as sysdba 
    SELECT * FROM table; 

これはbashスクリプトの内部をどのように見えるでしょうか?

ありがとうございました!

+0

どの回答がうまくいかず、なぜですか?この種のものには 'heredocs'を使用する例がたくさんあります。 –

+0

基本的に私が見つけたすべてのものは、sqlplusにアクセスした後、パスワードを渡すことや、いくつかのユーザ(接続/ sysdba)として接続していませんでした。 私はこれらのようなasnwersを見つけました: 'sqlplus -s user/password @ SID << EOF あなたのSQLクエリー; '。 – user3746480

+0

あなたはまだ何を意味するか分かりません。あなたは 'oracle'パスワード、つまりsys接続を意味しますか? [これが役立つかもしれないかどうかわからない](http://stackoverflow.com/a/33829973/266304);または[this](http://stackoverflow.com/a/31816242/266304)。または様々な他のもの。 –

答えて

0

次の例のように、echoを使用してsqlplusの標準入力にクエリを送ることができます。

echo "SELECT * FROM table;" | sqlplus -s user/[email protected]/DB 
1

これを行うにはいくつかの異なる方法があります。誰もが好きですが、SQLコマンドをsqlplusコマンドラインシェルに渡す前に一緒にグループ化できるという点で、すべて似ています。すべてのメソッドは、sqlplusからログファイルに書き込むための応答をキャプチャできますが、ほとんどのメソッドは変数の置換をサポートしていますが、パラメータの拡張に惑わされるものもあります。

個人的に私はいつもSQL文をすぐに変更して、古いバージョンの文をコメントとして保存することができるので、以下の方法を常に優先してきました。私は、これは他の例では行うことができます知っているが、私はちょうど個人的には、このメソッドを好む:

#!/bin/bash 

sqlplusを< < EOF 挿入:

#!/bin/bash 

exec > >(tee logs/logfile.$$) 
exec 2>& 

    { 
    echo "TRUNCATE TABLE test_runs;" 
    echo "INSERT INTO test_runs SELECT * FROM test_cases WHERE id = 6;" 
#  echo "SELECT * FROM table1 where x = 1;" 
     echo "SELECT * FROM table1 where x = 2;" 
#  echo "UPDATE table2 SET status=$STATUS WHERE complete=1;" 
     echo "exit;" 
    } | sqlplus <connect string> 

他の方法は、「ヒアドキュメント」の使用を作りますテーブル(field1、field2、field3)の値( 'a'、 'b'、 'c')に変換します。 EOF

または個別のファイルに開催されたSQLステートメントを使用します。

#!/bin/bash 
sqlplus <connect string> @query.sql 

またはsqlplusのネイティブ機能を利用:

#!/bin/bash 

sqlplus <connect string> -s 'SELECT parts FROM factory;' 
QUERY="SELECT parts FROM factory;" 
sqlplus <connect string> -s $QUERY 

は、最後のバージョンと、bashの変数を使用しての注意が必要、次の

#!/bin/bash 
QUERY="select * from $TABLE1 WHERE url =\"Compu-Global-Hyper-Mega-Net.com\";" 
sqlplus <connect string> -s $QUERY 

EDIT:

例シェルスクリプトから(セキュリティ誰でもかかわらず見ることのために、彼らはプロセステーブルに表示している懸念)

#!bin/bash 

{ 
    echo "SELECT 1 from dual;" 
} | sqlplus username/[email protected] 

SYSDBAとして接続している私の古いスクリプトをユーザー名とパスワードを渡します:

#!/bin/ksh 

get_asm() { 
$ORACLE_HOME/bin/sqlplus -s /nolog <<EOF 
connect/as sysdba 
col path format a35 
col CREATE_DATE format a20 
set lines 132 
set trims on 
set tab off 
set pages 2000 
select inst_id, DISK_NUMBER, header_status, 
     state,path,TOTAL_MB,FREE_MB, 
     to_char(CREATE_DATE,'yyyy-mon-dd hh24:mi') CREATE_DATE 
from gv\$asm_disk; 
EOF 
} 

ASMDISK=$1 
if [ ${ASMDISK}"x" == "x" ]; then 
    get_asm; 
else 
    get_asm | egrep "INST_ID|^--|${ASMDISK}" 
fi 
0

!/ binに/ bashの

... 
MY_LOGIN="..." 
MY_PASSWORD="..." 
MY_SID="..." 
sqlplus /nolog -s >file.log >error.log <<EOF 
    CONNECT ${MY_LOGIN}/${MY_PASSWORD}@${MY_SID} 
    ... your request ... 
EOF 
RET_CODE=$? 
... 

WARNING、この構文を使用することはありません:

sqlplus login/[email protected] ... 

ことで、 "PS" コマンドを使用することができます誰もが、すべてのあなたの接続情報を見ることができました。常に "/ nolog"を使用してください。

関連する問題