これを行うにはいくつかの異なる方法があります。誰もが好きですが、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
どの回答がうまくいかず、なぜですか?この種のものには 'heredocs'を使用する例がたくさんあります。 –
基本的に私が見つけたすべてのものは、sqlplusにアクセスした後、パスワードを渡すことや、いくつかのユーザ(接続/ sysdba)として接続していませんでした。 私はこれらのようなasnwersを見つけました: 'sqlplus -s user/password @ SID << EOF あなたのSQLクエリー; '。 – user3746480
あなたはまだ何を意味するか分かりません。あなたは 'oracle'パスワード、つまりsys接続を意味しますか? [これが役立つかもしれないかどうかわからない](http://stackoverflow.com/a/33829973/266304);または[this](http://stackoverflow.com/a/31816242/266304)。または様々な他のもの。 –