【问题标题】:PL/SQL and SQL script in one sqlFile with liquibase?带有 liquibase 的 sqlFile 中的 PL/SQL 和 SQL 脚本?
【发布时间】:2015-11-12 23:54:35
【问题描述】:

我尝试了很多选项来在包含 pl/sql 块和简单 sql 语句的房间 changeSet/sqlFile 中运行。例如:

BEGIN
    aud.someProcedure('parameter');
END;
/
insert into test_table(_id, value) VALUES(1, 'test');

但我得到以下异常:

liquibase.exception.MigrationFailedException: Migration failed for change set [xml path]:
     Reason: liquibase.exception.DatabaseException: ORA-06550: 4 line, 1 col:
PLS-00103: Encountered the symbol: "/" 
 [Failed SQL: BEGIN 
    aud.someProcedure('parameter'); 
END; 
//
insert into test_table(_id, value) VALUES(1, 'test')
]
    at liquibase.changelog.ChangeSet.execute(ChangeSet.java:584)
    at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51)
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73)
    at liquibase.Liquibase.update(Liquibase.java:210)
    at liquibase.Liquibase.update(Liquibase.java:190)
    at liquibase.Liquibase.update(Liquibase.java:186)
    at org.jenkinsci.plugins.liquibase.builder.LiquibaseBuilder.perform(LiquibaseBuilder.java:128)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
    at hudson.model.Build$BuildExecution.build(Build.java:205)
    at hudson.model.Build$BuildExecution.doRun(Build.java:162)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:537)
    at hudson.model.Run.execute(Run.java:1741)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:381)
Caused by: liquibase.exception.DatabaseException: ORA-06550: 4 line, col oszlop:
PLS-00103: Encountered the symbol: "/" 
 [Failed SQL: BEGIN 
    aud.someProcedure('parameter'); 
END; 
//
insert into test_table(_id, value) VALUES(1, 'test')
]

当我尝试在 xml 中更改 splitStatement 和 endDelimiter 时,没有任何改变。

你有什么想法吗?

【问题讨论】:

  • 我也面临同样的问题。找到任何解决方案了吗?谢谢mojoo
  • 我的回答能解决你的问题吗?如果您有任何其他问题,请告诉我们。

标签: sql oracle jenkins plsql liquibase


【解决方案1】:

在 sql 脚本文件中使用分号分隔 sql 语句,这些语句告诉客户端软件(SQL*Plus、SQL Developer)要执行的单个语句是什么。

在 sql 脚本文件中使用斜杠分隔 pl/sql 块,告诉客户端软件(SQL*Plus、SQL Developer)要执行的单个 pl/sql 块是什么。

当您想要执行缓冲语句时,在 SQL*Plus 命令行中使用斜杠(是的,它是没有分号的单个 sql 语句或没有斜杠的 pl/sql 块)

https://community.oracle.com/tech/developers/discussion/3981652/when-should-i-use-semicolon-or-slash-in-oracle

【讨论】:

    【解决方案2】:

    “endDelimiter”完美运行。

    SQL 语句中的分号会产生“无效字符错误”,所以当它不是分隔符时,您必须将其删除。 (是的,它在 PL/SQL 和 SQL*Plus 中工作,就像斜线“/”,更多:When do I need to use a semicolon vs a slash in Oracle SQL?)

    解决方案:

    • endDelimiter = "/"

      <changeSet id="1" author="me">
      <sql endDelimiter="/">
          BEGIN
              aud.someProcedure('parameter');
          END;
          /
          insert into test_table(_id, value) VALUES(1, 'test')
      </sql>
      </changeSet>
      
    • 两个部分

      <changeSet id="1" author="me">
      <sql endDelimiter="/">
          BEGIN
              aud.someProcedure('parameter');
          END;
      </sql>
      <sql>
          insert into test_table(_id, value) VALUES(1, 'test');
      </sql>
      </changeSet>
      
    • 或者也许;)

      <changeSet id="1" author="me">
      <sql endDelimiter="#Gabor was here#">
          BEGIN
              aud.someProcedure('parameter');
          END;
          #Gabor was here#
          insert into test_table(_id, value) VALUES(1, 'test')
      </sql>
      </changeSet>
      

    【讨论】:

    • 您还没有真正回答他的问题,因为他说他使用的是 sqlFile 更改类型,这意味着他的 SQL 存储在一个单独的文件中(尽管公平地说,他没有提到这一点)。但无论如何,这就是我正在尝试做的事情,并且在使用“/\n”并且仅使用“/”在使用除数的表达式时失败时出现完全相同的错误。
    【解决方案3】:

    尝试将插入语句放在 Begin, end 块中,并可能删除尾部斜杠 (/) 字符:

    BEGIN
      aud.someProcedure('parameter');
      insert into test_table(_id, value) VALUES(1, 'test');
    END;
    

    斜杠是 SQL*Plus 和其他一些交互式查询工具使用的终止字符,用于表示 PL/SQL 块的结束。

    【讨论】:

    猜你喜欢
    • 2017-10-16
    • 2016-09-23
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多