2011-12-04 25 views
2

我有幾個sql文件。我需要在交易中執行它們。發生錯誤時,所有更改都將回滾。Oracle - 在事務中執行幾個sql文件

這是可能用sqlplus或其他一些工具?

編輯有沒有在這些文件中任何明確的提交,只是DDL SQL。

+0

如果不涉及隱式提交(例如數據定義語句),只需將所有源文件連接成一個更大的文件。 – artistoex

+1

你沒有提供任何細節...但通常:這是否可能取決於SQL文件的內容(例如,是否有明確的「COMMIT」?是否包含任何存儲過程?是否有任何DDL命令?是否包含任何數據庫鏈接?等等)...如果您不知道/控制SQL文件的內容,我會拒絕... – Yahia

+0

感謝您的編輯...請參閱下面的答案.. 。 – Yahia

回答

3

一般:這是否可行取決於極端的SQL文件的內容 - 例如:

  • 是否有明確的COMMIT S'
  • 是否涉及任何存儲過程?
  • 是否有任何DDL命令?
  • 是否涉及任何數據庫鏈接?

如果你不知道/有過SQL文件,我會說不的內容控制..

,如果你能確保該文件不包含任何COMMIT,任何DDL,任何存儲過程調用等等,那麼你可能只是將它們連接起來,並在一個事務中執行他們...如何做到這一點正是依賴於你的工具...

更新 - 增加了OP後SQL文件包含DDL命令:

的答案是否定的,因爲DDL命令使用隱COMMIT - 儘管有些數據塊可能會允許一些「變通方法」(例如Oracle有一個可配置的「閃回片區」這可能是「受虐待」,實現你想要的)但大多數不。

通常的辦法來解決這個(DDL腳本/交易)是寫2個腳本 - 一個讓所有的變化......,第二個只有在執行第一個出現錯誤運行...如何準確地寫這樣的腳本取決於你的情況的具體情況。

1

使用start命令和whenever sqlerror然後就是不提交。

+0

,將無法可靠地工作,如果SQL文件包含'COMMIT'自己和/或DDL命令和/或使用DB鏈接和/或使用存儲過程等 – Yahia

+0

我的意思是隱性承諾過,這是太明顯了。不要把一個簡單的問題變成一個簡單的問題! –

1

在Oracle中,每一個DDL(數據定義語言)命令,例如CREATE ...,ALTER ... DROP或隱...提交前和會後聲明。因此,由於您的SQL文件包含這些語句,因此您無法爲它們全部提供單個事務。

這不是使用多個文件的限制。這是所有Oracle DDL語句的限制。

+0

你是對的!一個補充:在Oracle的情況下,您可以濫用閃回區域以將任何和所有內容回滾到特定時間點(不推薦!)。 – Yahia

相關問題