次のような問題に直面しています。
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
参考文献: