1

Liquibase の Grails データベース移行プラグインを使用しています。移行でPLSQLステートメントを使用して、テーブルの制約を見つけて削除しようとしていますが、制約の名前がわからず、使用するシステムによって異なるため、このアプローチを使用しています。

いくつかのメモ:

  • グレイル 1.3.7
  • データベース移行 1.0

これは移行のコードです

sql("declare\n" +
      "vOldName all_constraints.constraint_name%TYPE\n" +
    "begin\n" +
      "select CONSTRAINT_NAME\n" +
      "into   vOldName\n" +
      "from   all_constraints\n" +
      "where  TABLE_NAME='TABLENAME' and CONSTRAINT_TYPE='U' and OWNER='USERNAME'\n" +
      "execute immediate 'alter table USERNAME.TABLENAMEdrop constraint '\n" +
      "|| vOldName\n" +
    "end")

これを実行すると、次のエラーが表示されます。

java.sql.SQLException: ORA-06550: line 3, column 1:
  PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:
    := ( ; not null range default character
  The symbol ";" was substituted for "BEGIN" to continue.

各ステートメントの最後に追加しようとし;ましたが、コードでファイルの終わりが表示されると不平を言います。

何か助けてください?

4

1 に答える 1

0
sql("declare\n" +
      "vOldName all_constraints.constraint_name%TYPE;\n" +
    "begin\n" +
      "select CONSTRAINT_NAME\n" +
      "into   vOldName\n" +
      "from   all_constraints\n" +
      "where  TABLE_NAME='TABLENAME' and CONSTRAINT_TYPE='U' and OWNER='USERNAME';\n" +
      "execute immediate 'alter table USERNAME.TABLENAME drop constraint '\n" +
      "|| vOldName;\n" +
    "end;")

これで直ると思います。PL/SQL ブロックでは、各ステートメントの後にセミコロンが必要です。セミコロンを必要としない唯一のものは、動的 SQL です。TABLENAMEまた、 と の間にスペースがありませんでしたdrop

最初にコードが SQL*Plus またはその他のデータベース ツールで機能することを確認すると役立つ場合があります。そして、それを複数行の文字列に貼り付けます。

うまくいかない場合はお知らせください。

于 2012-10-03T02:36:17.637 に答える