1

我使用的是 liquibase 的 Grails 数据库迁移插件。我试图在迁移中使用 aPLSQL 语句来查找和删除表上的约束,我使用这种方法,因为我不知道约束的名称,并且它会因我使用的不同系统而异。

一些注意事项:

  • 圣杯 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 回答