5

私はSQLスクリプトを持っています:

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 dbです。

どうしたの?

4

2 に答える 2

5

Oracle のステートメントをまとめてバッチ処理するには、BEGIN...END ブロックで囲む必要があります。コメントでリンクした最後の例では、2 番目のステートメントの直後と 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で問題をログに記録することをお勧めします

于 2013-02-03T17:48:45.170 に答える
1

ここで、BEGINステートメントとENDステートメントだけでなく、CREATEALTERとDROPにもEXECUTEIMMEDIATEを使用します。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;
于 2013-02-03T18:31:49.363 に答える