2013-02-03 47 views
2

運行SQL腳本我有SQL腳本:與fluentmigrator

CREATE TABLE TESTTABLE1(
    ID_TESTTABLE1   NUMBER (18) NOT NULL, 
    TESTTABLE_VALUE1  NUMBER (18), 
    TESTTABLE_KEY1  NUMBER (18)) 

,並使用Fluentmigrator:

[Migration(201302021800)] 
public class Migration_201302021800 : AutoReversingMigration 
{ 
    public override void Up() 
    { 
     var url = @"Update_1.0.0.5.sql"; 
     Execute.Script(url); 
    } 
} 

它成功地執行了,如果我添加一些SQL:

CREATE TABLE TESTTABLE1 
(
    ID_TESTTABLE1   NUMBER (18) NOT NULL, 
    TESTTABLE_VALUE1  NUMBER (18), 
    TESTTABLE_KEY1  NUMBER (18) 
); 
CREATE TABLE TESTTABLE 
(
    ID_TESTTABLE   NUMBER (18) NOT NULL, 
    TESTTABLE_VALUE  NUMBER (18), 
    TESTTABLE_KEY  NUMBER (18) 
); 

執行在Fluentmigrator失敗,與Oracle exeption {"ORA-00911: invalid character"}

我的數據庫是Oracle數據庫。

有什麼問題?

+0

您是否嘗試過在流利遷移器之外運行擴展SQL?它將幫助您區分問題是流利遷移還是純SQL。 – mipe34

+0

當然是。它在oracle中成功執行。但我認爲問題在於需要執行一個單一的sql命令(如果它是從c#執行的),並不是一次完成。但我認爲這就是一次性運行的解決方案。 – AndreyMaybe

+0

因爲我想你已經檢查了錯誤的潛在來源(http://www.techonthenet.com/oracle/errors/ora00911.php)。我建議將SQL分成兩個文件。它通常幫助我通過流利的移民。 – mipe34

回答

3

要一起爲Oracle進行批處理語句,您需要將它包含在BEGIN ... END塊中。在最後一個示例中,您在註釋中鏈接到的是在第二個語句之後和END關鍵字之前缺少分號的分號。

BEGIN 
CREATE TABLE TESTTABLE1 
    ( 
     ID_TESTTABLE1   NUMBER (18) NOT NULL, 
     TESTTABLE_VALUE1  NUMBER (18), 
     TESTTABLE_KEY1  NUMBER (18) 
    ); 
CREATE TABLE TESTTABLE 
    ( 
     ID_TESTTABLE   NUMBER (18) NOT NULL, 
     TESTTABLE_VALUE  NUMBER (18), 
     TESTTABLE_KEY  NUMBER (18) 
    ); 
END; 

儘管FluentMigrator在這種情況下可以提供更好的支持。例如,當FluentMigrator處理來自Sql Server的多語句腳本時,它會分割腳本並執行每條語句(https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator.Runner/Processors/SqlServer/SqlServerProcessor.cs#L197-236)。所以我會建議在https://github.com/schambers/fluentmigrator/issues

1

https://github.com/schambers/fluentmigrator/issues現在我不僅使用BEGIN和END語句,所以也執行IMMEDIATE執行CREATE ALTER和DROP。對於INSERT,我只使用BEGIN和END。

BEGIN 
EXECUTE IMMEDIATE'CREATE TABLE TESTTABLE1 
( 
    ID_TESTTABLE1   NUMBER (18) NOT NULL, 
    TESTTABLE_VALUE1  NUMBER (18), 
    TESTTABLE_KEY1  NUMBER (18) 
)'; 
EXECUTE IMMEDIATE 'CREATE TABLE TESTTABLE 
( 
    ID_TESTTABLE   NUMBER (18) NOT NULL, 
    TESTTABLE_VALUE  NUMBER (18), 
    TESTTABLE_KEY  NUMBER (18) 
)'; 
END;