简体   繁体   English

使用fluentmigrator运行SQL脚本

[英]run sql scripts with fluentmigrator

I have SQL script: 我有SQL脚本:

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

and use Fluentmigrator: 并使用Fluentmigrator:

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

It executes successfully, and if I add some SQL: 它成功执行,并且如果我添加一些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)
);

execute in Fluentmigrator fails, with Oracle exeption {"ORA-00911: invalid character"} . 在Fluentmigrator中执行失败,并带有Oracle exeption {"ORA-00911: invalid character"}异常Oracle exeption {"ORA-00911: invalid character"}

My database is Oracle db. 我的数据库是Oracle db。

What's the problem? 有什么问题?

To batch statements together for Oracle you need to have it enclosed in a BEGIN...END block. 要一起为Oracle批处理语句,您需要将其放在BEGIN ... END块中。 In your last example that you linked to in the comments you are missing a semicolon right after the second statement and before the END keyword. 在您在注释中链接的上一个示例中,第二个语句之后和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;

Although FluentMigrator could provide better support in this case. 尽管在这种情况下FluentMigrator可以提供更好的支持。 For example, when FluentMigrator processes multi-statement scripts from Sql Server then it splits up the script and executes each statement ( https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator.Runner/Processors/SqlServer/SqlServerProcessor.cs#L197-236 ). 例如,当FluentMigrator处理来自Sql Server的多语句脚本时,它将拆分该脚本并执行每个语句( https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator.Runner/Processors/SqlServer/ SqlServerProcessor.cs#L197-236 )。 So I would recommend logging an issue at https://github.com/schambers/fluentmigrator/issues 所以我建议在https://github.com/schambers/fluentmigrator/issues记录问题

Now i use not only BEGIN and END statement, so also EXECUTE IMMEDIATE for CREATE ALTER and DROP. 现在,我不仅使用BEGIN和END语句,还使用EXECUTE IMMEDIATE进行CREATE ALTER和DROP。 For INSERT i use only BEGIN and END. 对于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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM