sqlpludを使用するときのUnixコマンドの置き換え

sqlpludを使用するときのUnixコマンドの置き換え

Unixシェルスクリプトでsqlファイルを呼び出してみてください。

Sql1.shの実行

#!/bin/sh
## steps to get the connection and form it.
result=`sqlplus -S ${connectURL} << EOF
SET PAGES 0 lines 800
@ /sql/testQuery.sql ${LOGFILE} 
EOF`

echo $result

上記のスクリプトの出力(予想どおりに動作し、例外なし)

フロントモジュラス:0リアモジュラス:16エラーはありません。

Sql2.sh 実行 {開始空間は、結果変数の下に保持されます。}

#!/bin/sh
result=`sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
      EOF`

echo $result

実行すると、ExecuteSql2.sh出力は次のようになります。

ExecuteSql2.sh:行147:警告:ここではファイルの末尾に区切られた144行の文書(「EOF」が必要です)MODULUS BEFORE:0 MODULUS AFTER:16エラーはありません。 SP2-0042: 不明なコマンド 'EOF' - 残りの行は無視されます。


スペースを置き換えるために「組み込みコマンドを使用するときに不明な場合は、この問題が発生する可能性があります。

これには特別な理由がありますか?

query.sql テスト:

SET SERVEROUTPUT ON SIZE UNLIMITED
set heading off verify off feedback off echo off

SPOOL &1

declare
 modulus NUMBER := 0;
BEGIN
  DBMS_OUTPUT.PUT_LINE('MODULUS BEFORE: '||modulus);

select mod(100,21) into modulus from dual;

DBMS_OUTPUT.PUT_LINE('MODULUS AFTER: '||modulus);

end;
/

SET ECHO ON FEEDBACK ON
SHOW ERRORS
SPOOL OFF

ベストアンサー1

文書によると3.6 リダイレクト - 3.6.6 ここに文書化:

このタイプのリダイレクトは行に単語(末尾の空白なし)が見えます。この時点までに読み取られたすべての行は、コマンドの標準入力(またはnが指定されている場合はファイル記述子n)として使用されます。

この文書の形式は次のとおりです。

[n]<<[-]word
        here-document delimiter
delimiter 

したがって、あなたのコードは

result=`sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
EOF
`

最後の `` ''はEOFの下になければなりませんが、$()以下の表記法を使用する方が良いと思います。

result=$(sqlplus -S ${dbConnect} << EOF
      SET PAGES 0 lines 800
      @ /sql/testQuery.sql ${LOGFILE};
EOF
)

おすすめ記事