2017-07-18 44 views
0

我正在使用SqlPlus運行sql腳本的代碼。大多數腳本中都有DDL,它需要一個/(正斜槓)來運行緩衝區。有些腳本缺少斜槓。我曾嘗試運行腳本(如@ script.sql和/),但它有時會嘗試創建兩次。我還想在最後運行show errors命令,有時如果/缺失,會給我造成麻煩。有沒有辦法確定sqlplus緩衝區是否已經發送到服務器?

所以,我改爲@script。 (期間)顯示錯誤。當/存在於文件中時,這是有效的,但是現在,如果文件中缺少/,如果通過不創建對象而混亂。

我們嘗試了一些邏輯來檢查/在文件中結束,但在我看來這是一個混亂的選項。我有誤報,這不是一個完美的解決方案。

我曾考慮嘗試使用另一種工具來運行,但由於我工作的公司已經發布了這個版本,並且客戶希望它能夠使用sqlplus運行,並且可能包含只能在sqlplus中運行的命令;那不符合JDBC,我認爲這不是一個適當的解決方案。

我現在在想,如果我可以檢查/是否已經在當前的緩衝區上運行,並且只有在沒有的情況下運行,那麼這將是一個很好的解決方案,也許是完美的,但是我找不到任何文檔這樣的命令存在。還有另一種解決問題的方法嗎?這樣的命令是否存在? 謝謝!

回答

1

SQLPlus非常有限。即使您確定緩衝區是否已經發送,也沒有控制機制來執行IF/THEN。

一兩件事你可以做的是,在運行腳本之前,你叫

exec begin raise login_denied; end; 

腳本後,調用

#show sqlcode 

如果仍顯示1017(用於login_denied錯誤代碼) ,那麼你可以確信腳本沒有執行任何SQL語句。如果您願意,您可以使用用戶定義的錯誤代碼,例如raise_application_error(-20123,'dummy');

請注意,我在show語句中包含了#前綴。在不影響緩衝區內容的情況下運行該命令,所以如果您發現任何內容都沒有被執行,您可以嘗試使用斜槓運行緩衝區內容。

如果你有一個包含多個DDL的腳本(例如一個表加上索引/授權/約束...),那麼如果它沒有斜線,你仍然有運行最終命令的風險。

+0

這是一個很好的答案,謝謝。我沒有想過如果/那麼缺乏。這真的是一個限制。我感謝你的時間和答覆。 –

相關問題