sql >> データベース >  >> RDS >> Oracle

SpringBootアプリケーションのschema.sqlにDROPTABLEIFEXISTSを使用できません

    Javaコードを表示していませんが、スタックトレースから、ScriptUtilのexecuteSqlScript() 方法 、デフォルトのセミコロンステートメント区切り文字を使用しました。

    PL / SQLブロックを単一のユニットとして認識せず、代わりに最初のセミコロンまでのすべてをスタンドアロンSQL文として実行しようとします。これは無効であり、表示されるエラーの原因になります。

    >

    executeSqlScript()のバージョン これにより、デフォルトを上書きして/を使用できます 代わりに:

    つまり、スクリプト内のすべてのSQLステートメントで/を使用する必要があります。 セミコロンの代わりに区切り文字も:

    BEGIN
      EXECUTE IMMEDIATE 'DROP TABLE table_a';
      EXCEPTION
      WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
        RAISE;
      END IF;
    END;
    /
    
    CREATE TABLE table_a
      (
        id               VARCHAR(5) PRIMARY KEY,
        name             VARCHAR(100)
      )
    /
    
    ...
    

    コメントに記載されているように、元のブロックはとにかく正しくありませんでした。およびcreate dropであっても、PL/SQLを介して実行する必要はありません。 する必要があります。

    ただし、そのメソッドにはignoreFailedDropsもあります フラグ。これはあなたが望むことを正確に実行しているようです(ただし、テストして確認することはできません):

    そのバージョンを使用し、そのフラグにtrueを渡す場合、ドロップの周りにPL/SQLラッパーは必要ありません。セミコロン区切り文字を保持して、次の状態に戻すことができます:

    DROP TABLE table_a;
    
    CREATE TABLE table_a
    (
        id                       VARCHAR(5) PRIMARY KEY,
        name                     VARCHAR(100)
    );
    
    ...
    

    スキーマスクリプトに他のPL/SQL(トリガー、パッケージなど)が含まれている場合でも、すべてにスラッシュ区切り文字(または他の任意の区切り文字。スラッシュは従来の方法です)を使用するように切り替える必要があります。



    1. ORDERBYを使用するとクエリが遅くなる

    2. MariaDBの日付から月を返す4つの関数

    3. 2つのテーブルからSQLデータをプルする

    4. nodejsを使用してawsathenaを使用する方法は?