Linux

使用 sqlplud 時的 Unix 命令替換

  • April 30, 2020

試圖從 unix shell 腳本呼叫一個 sql 文件。

ExecuteSql1.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

上述腳本的輸出(按預期工作,無一例外)

MODULUS BEFORE: 0 MODULUS AFTER: 16 沒有錯誤。

ExecuteSql2.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”) 前模數:0 後模數:16 沒有錯誤。SP2-0042:未知命令“EOF”- 忽略行的其餘部分。


使用,不知道何時使用帶有空格的 `` 內置命令替換會導致此問題。

這有什麼具體原因嗎?

測試查詢.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

根據文件3.6 Redirections - 3.6.6 Here Documents

這種類型的重定向指示 shell 從目前源讀取輸入,直到看到只包含單詞(沒有尾隨空格)的行。然後,所有讀取到該點的行都用作命令的標準輸入(或文件描述符 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
)

引用自:https://unix.stackexchange.com/questions/583434