2014-06-12 71 views
3

因此,給定一個要在Oracle中執行的SQL文件,我們需要確定在SQL文件中要執行的塊數。例如,存在於含有以下命令的SQL文件中的一個塊,如何計算SQL文件中有多少個sql語句?

CREATE TABLE customer (id varchar2(42)); 

兩個塊中的以下SQL文件,

ALTER TABLE customer ADD name varchar2(42); 
ALTER TABLE customer DROP COLUMN id; 

和三個塊中的以下SQL文件

CREATE OR REPLACE PROCEDURE printHelloWorld IS 
BEGIN 
    dbms_output.put_line('Hello World!'); 
END; 
/

INSERT INTO customer VALUES ('ivan'); 

DROP TABLE customer; 

除了在Oracle SQLDeveloper中沒有任何錯誤的情況下執行它之外,我們不能假設任何有關輸入的內容。

UPDATE

問這個問題的目的是爲了確保只會有一個說法,這是要執行,在SQL文件。我也接受這個問題的答案。能夠創建腳本將多語句SQL文件拆分爲多個文件會更好。

+1

答案的準確程度如何?該解決方案可能涉及一些第三方分析器,其中沒有一個將100%準確。爲了直接解決一個困難的解析問題,你是否願意接受一個解決方案,這樣的代碼不能正常工作:'declare test varchar2(100):= q'< ' >';開始null; end;' –

+0

只要它在大多數情況下都很好(因爲這些SQL腳本將用於軟件開發,這在大多數情況下可能是非惡意的),它並不一定非常準確。@jonearles –

回答

2

不是一個完美的解決方案,但會在大多數情況下工作,我認爲。

首先創建一個沒有權限的duff用戶,除了創建一個會話。

CREATE USER duff IDENTIFIED BY "password"; 
GRANT CREATE SESSION TO duff; 

然後用sqlplus和grep來計算ORA-錯誤 - 應該是每個語句一個。

sqlplus duff/[email protected] < script.sql | grep -c ORA- 

如果你有ALTER SESSION語句的話,你需要更多的

sqlplus duff/[email protected] < script.sql | grep -Ec 'ORA-|Session altered.' 

也許有其他異常,但我認爲它給你小的開銷可行的解決方案。要小心腳本不會切換用戶 - 但如果腳本中有硬編碼的用戶名和密碼,則還有其他問題。