我有幾個sql文件。我需要在交易中執行它們。發生錯誤時,所有更改都將回滾。Oracle - 在事務中執行幾個sql文件
這是可能用sqlplus或其他一些工具?
編輯有沒有在這些文件中任何明確的提交,只是DDL SQL。
我有幾個sql文件。我需要在交易中執行它們。發生錯誤時,所有更改都將回滾。Oracle - 在事務中執行幾個sql文件
這是可能用sqlplus或其他一些工具?
編輯有沒有在這些文件中任何明確的提交,只是DDL SQL。
一般:這是否可行取決於極端的SQL文件的內容 - 例如:
COMMIT
S'等
如果你不知道/有過SQL文件,我會說不的內容控制..
,如果你能確保該文件不包含任何COMMIT
,任何DDL,任何存儲過程調用等等,那麼你可能只是將它們連接起來,並在一個事務中執行他們...如何做到這一點正是依賴於你的工具...
更新 - 增加了OP後SQL文件包含DDL命令:
的答案是否定的,因爲DDL命令使用隱COMMIT
- 儘管有些數據塊可能會允許一些「變通方法」(例如Oracle有一個可配置的「閃回片區」這可能是「受虐待」,實現你想要的)但大多數不。
通常的辦法來解決這個(DDL腳本/交易)是寫2個腳本 - 一個讓所有的變化......,第二個只有在執行第一個出現錯誤運行...如何準確地寫這樣的腳本取決於你的情況的具體情況。
使用start命令和whenever sqlerror然後就是不提交。
,將無法可靠地工作,如果SQL文件包含'COMMIT'自己和/或DDL命令和/或使用DB鏈接和/或使用存儲過程等 – Yahia
我的意思是隱性承諾過,這是太明顯了。不要把一個簡單的問題變成一個簡單的問題! –
在Oracle中,每一個DDL(數據定義語言)命令,例如CREATE ...,ALTER ... DROP或隱...提交前和會後聲明。因此,由於您的SQL文件包含這些語句,因此您無法爲它們全部提供單個事務。
這不是使用多個文件的限制。這是所有Oracle DDL語句的限制。
你是對的!一個補充:在Oracle的情況下,您可以濫用閃回區域以將任何和所有內容回滾到特定時間點(不推薦!)。 – Yahia
如果不涉及隱式提交(例如數據定義語句),只需將所有源文件連接成一個更大的文件。 – artistoex
你沒有提供任何細節...但通常:這是否可能取決於SQL文件的內容(例如,是否有明確的「COMMIT」?是否包含任何存儲過程?是否有任何DDL命令?是否包含任何數據庫鏈接?等等)...如果您不知道/控制SQL文件的內容,我會拒絕... – Yahia
感謝您的編輯...請參閱下面的答案.. 。 – Yahia