SQL Plus で「$」を使用するにはどうすればいいですか?

SQL Plus で「$」を使用するにはどうすればいいですか?

次のような問題に直面しています。

SLES の sqlplus で次のコマンドを実行しようとすると:

sqlplus -S user/[email protected] <<EOF
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM GV$INSTANCE;
EOF

次のエラーが表示されます:

SQL> SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED FROM GVINSTANCE
                                                                                       *
ERROR at line 1:
ORA-00942: table or view does not exist

クエリに「$」が含まれているためだと思いますが、よくわかりません。

Linux を OS として使用して、sqlplus クライアントでそのコマンドを実行する方法はありますか?

もし私が何か間違ったことをしているなら、正しい方向を指示してください。


環境の詳細。

  • OS = SuSE Linux Enterprise Server 11 SP3
  • Oracle Instant Client = リリース 12.1.0.2.0
  • SQLPLUS = SQL*Plus: リリース 12.1.0.2.0

答え1

少なくとも 1 つの問題はシェルの構文にあります。

sqlplus -S user/[email protected] <<EOF
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM GV$INSTANCE;
EOF

これは「ヒアドキュメント」と呼ばれ、シェル変数( で始まる名前$)は通常は展開されます。展開されないようにするには、引用の最初の使用EOF例、

sqlplus -S user/[email protected] <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM GV$INSTANCE;
EOF

もう 1 つの問題は、テーブル名に特殊文字が含まれていることです。これも引用符で囲むことができます (Oracle に SQL で使用する構文規則の一部を無視するように指示します)。改善は次のようになります。

sqlplus -S user/[email protected] <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM "GV$INSTANCE";
EOF

参考文献:

関連情報