3

C シェル スクリプトで記述されたスクリプトを sql plus コマンドを使用して oracle データベースから情報を取得するように書き直そうとしていますが、それを mysql に置き換えており、すべての sqlplus 構文を mysql 構文に置き換えたいと考えています。このコマンドの意味を説明するように、すべての C シェルの達人にお願いしています。

 set SQLPLUS=${ORACLE_HOME}/bin/sqlplus 

 set REPORT=${MYBD_HOME}/Scripts/report.sql

そのため、行のどこかで、次のコマンドを使用して sql plus コマンドを呼び出します。

 ${SQLPLUS} ${MYDBUSER} @ &{REPORT}

右側の値 ({ORACLE_HOME}/bin/sqlplus) が sqplus コマンドが配置されている場所へのパスであることを理解していると言うことができるので、コマンドと {REPORT=$(MYBD_HOME} /Scripts.report.sql) は、sqplus コマンドを呼び出すことによって実行される SQL スクリプトが存在するパスは正しいですか?

私が理解していないのは、setコマンドがこれを初期化しているものです。SQLPLUS は変数なので、.csh スクリプトに入力しようとするときにパスを入力する必要はありませんか?

その場合、mysql データベースでこのスクリプトを実行するために必要なことは、msql exec が正しいパスを指すように SQLPLUS (おそらく MYSQL に変更) を設定するだけです。

  set MYSQL=${MYSQL_HOME}/bin/mysql

次に、mysql を呼び出して sql ステートメントを実行します。

  ${MYSQL}${MYDBUSER}@${REPORT}

これは、mysql テーブルからデータを取得するために同じ .tsch スクリプトを実行するために必要なことですか?

4

1 に答える 1

2

次のようなものが必要です。

${MYSQL} -u $username -p$password -D $database < ${REPORT}

(ユーザー名とパスワードは、SQLPlus に渡されるのとは異なる方法で mysql 実行可能ファイルに渡されます。${MYDBUSER} からユーザー名とパスワードを解析する必要があります。おそらく、" scott/tiger" などの文字列が含まれています。 mysql コマンド ライン クライアントでは " -u scott -ptiger -D scott" と同等です。

その @ (アットマーク) は SQLPlus のものです。指定されたファイル名から入力を読み取るよう SQLPLus に指示します。mysql で同等のものはsourceコマンドです。

${MYSQL} -u $username -p$password <_EOD!
use $database 
source ${REPORT}
_EOD!

また、report.sqlファイルにはspoolおよびその他の SQLPLus 固有のコマンドが含まれている可能性があります。mysql コマンド ライン クライアントは、SQLPlus ほど強力なレポート ツールには遠く及びません。


補遺:

Q:スプールは正確に何をしますか?

SQLPlusspoolコマンドは、出力をファイルに送信します。これは、SQLPLus セッションからログ ファイルを作成するためによく使用され、レポート ファイルの作成にも役立ちます。

set trimspool on
spool /tmp/file.lis
select 'foo' as foo from dual;
spool off

Q:ユーザー名とパスワードを変数に設定して使用できないのはなぜですか?

変数を設定すると、OS に送信されるコマンド ラインの最終結果は同じになります。

set MYDBUSER="-u username -ppassword -D database"
${MYSQL} ${MYDBUSER} <${REPORT}

Q: mysql は sqlplus よりも冗長なようです。

mysql コマンド ライン クライアントは、UNIX スタイルのオプションを使用します。これらは同等です:

mysql -u myusername -pmypassword -D mydatabase
mysql --user=myusername --password=mypassword --database=mydatabase
于 2012-06-20T21:16:05.550 に答える