2016-08-23 162 views
0

我在AIX上使用ksh。創建了一個unix腳本,它生成創建或替換視圖 ...和GRANT ..語句,它們被放置在一個單獨的.txt文件中。現在我需要在Oracle中執行文件中的內容(大約有300個視圖創建和授權語句),我需要記錄即將執行的sql語句以及Oracle是否創建視圖的反饋。 我摘錄竟把Unix到Sqlplus - 記錄要執行的SQL語句和執行結果

sqlplus -s username/[email protected] <<EOF 
SET ECHO ON; 
SET NEWPAGE 0; 
SET PAGESIZE 0; 
SET LINESIZE 200; 
SET LONG 10000000; 
SET TRIMSPOOL ON; 
SET HEADING OFF; 
SET FEEDBACK ON; 
SET VERIFY ON; 
SET TERMOUT OFF; 
SET SQLBLANKLINES ON; 

SPOOL ${drctry}/${v_timestamp}_sql_execution_log.txt 
@${drctry}/${v_date}_sql_statements.txt 
SPOOL OFF; 

EXIT; 

EOF 

如果該文件的內容_ $ {} v_date是_sql_statements.txt_

CREATE OR REPLACE VIEW V_TABLE1 AS SELECT * FROM TABLE1; 
GRANT SELECT ON V_TABLE1 TO USER1; 
... 
CREATE OR REPLACE VIEW V_TABLE300 AS SELECT * FROM TABLE300; 
GRANT SELECT ON V_TABLE300 TO USER300; 

預期輸出:

CREATE OR REPLACE VIEW V_TABLE1 AS SELECT * FROM TABLE1; 
View created 
GRANT SELECT ON V_TABLE1 TO USER1; 
Grant succeeded 
... 
CREATE OR REPLACE VIEW V_TABLE300 AS SELECT * FROM TABLE300; 
View created 
GRANT SELECT ON V_TABLE300 TO USER300; 
Grant succeeded 

經過一番搜索,發現List選項;但是它只記錄最後一條語句,如果我們有超過1條語句,這個語句不適合這裏。在Teradata BteqECHOREQuired屬性可以設置爲ON爲此任務。但我不確定在Oracle中。也試過 sqlplus -s username/[email protected] <<EOF > ${drctry}/${v_timestamp}_unix_sql_log.txt但仍然沒有運氣。一旦我解決了這個問題,將會更改密碼硬編碼;感謝您的時間:)

+0

只是好奇的是刷新過程的這一部分或什麼? – mmmmmpie

回答

1

-s[ilent] option

禁止所有的SQL * Plus信息和提示消息,包括命令提示符,命令迴應,和旗幟,當您啓動SQL正常顯示*加。

因此,通過包括-s標誌要覆蓋set echo on指令。

如果省略則命令在後臺打印文件迴盪,但(a)您還將看到stdout和旗幟(b)您看到SQL>提示和呼應太腳本名稱spool off。您可以通過重定向輸出固定的第一部分,與風險,你可能會錯過你所關心的,如果有問題的東西,改變你的shell命令做:

sqlplus -s username/[email protected] >/dev/null <<EOF 

而且你可以部分修復後臺通過改變提示,增加輸出:

SET SQLPROMPT "" 

隨着殼認爲沒有輸出這些變化,並且閥芯文件包含:

@/path/to/v_date_sql_statements.txt 
CREATE OR REPLACE VIEW V_TABLE1 AS SELECT * FROM TABLE1; 

View created. 

GRANT SELECT ON V_TABLE1 TO USER1; 

Grant succeeded. 

... 

SPOOL OFF; 

您可能會後期處理該操作,以刪除第一行和最後一行,以及(如果需要)刪除空行。您還可以通過在heredoc中包含文本文件來隱藏腳本名稱,而不是使用start/@:

SPOOL ${drctry}/${v_timestamp}_sql_execution_log.txt 
`cat ${drctry}/${v_date}_sql_statements.txt` 
SPOOL OFF; 
+1

完美@Alex Poole;也感謝您使用_sqlprompt_選項。如果有其他用戶確實需要它,則會顯示行號並使用_sqlnumber_屬性將其刪除。 – chill3chee

+0

對,我沒有嘗試任何多行語句。好的補充。 –