Linux
使用 sqlplud 時的 Unix 命令替換
試圖從 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 )