plsql 在 Sql Developer 中有效,但在 liquibase 更改中无效 ORA-06550 PLS-00103
plsql works in Sql Developer, but not in a liquibase change ORA-06550 PLS-00103
我有以下代码 运行ning 在 SQL 开发人员中没有问题,但是当我放入一个 liquibase 更改并 运行 它时,我得到一个错误。
DECLARE
seqval NUMBER;
BEGIN
SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
END;
及其变更集:
<changeSet author="Cristian Marian (cmarian)" id="2019-05-24-171101 Fix Items sequence - creting">
<sql>
DECLARE
seqval NUMBER;
BEGIN
SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
END;
</sql>
</changeSet>
错误如下所示:
Reason: liquibase.exception.DatabaseException: ORA-06550: line 2, column 27:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( @ % ; not null range default character
[Failed SQL: DECLARE
seqval NUMBER] (Liquibase Update failed.)
通常,动态 SQL 不需要语句终止符。我不知道 Liquibase,但似乎 需要它。
我不确定我是否理解您在末尾连接一个空字符串的意思:
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
^
empty string?
连接一个 semi-colon 怎么样,即
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||';');
^
semi-colon
Liquibase 将尝试通过默认语句分隔符 ;
拆分 <sql>
标记内的 "script"。对于 PL/SQL 块,这显然是错误的,因为整个块需要被视为单个语句。
为此,请在 <sql>
标签中使用 splitStatements
属性:
<sql splitStatements="false">
DECLARE
....
END;
</sql>
我有以下代码 运行ning 在 SQL 开发人员中没有问题,但是当我放入一个 liquibase 更改并 运行 它时,我得到一个错误。
DECLARE
seqval NUMBER;
BEGIN
SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
END;
及其变更集:
<changeSet author="Cristian Marian (cmarian)" id="2019-05-24-171101 Fix Items sequence - creting">
<sql>
DECLARE
seqval NUMBER;
BEGIN
SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
END;
</sql>
</changeSet>
错误如下所示:
Reason: liquibase.exception.DatabaseException: ORA-06550: line 2, column 27:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( @ % ; not null range default character
[Failed SQL: DECLARE
seqval NUMBER] (Liquibase Update failed.)
通常,动态 SQL 不需要语句终止符。我不知道 Liquibase,但似乎 需要它。
我不确定我是否理解您在末尾连接一个空字符串的意思:
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
^
empty string?
连接一个 semi-colon 怎么样,即
execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||';');
^
semi-colon
Liquibase 将尝试通过默认语句分隔符 ;
拆分 <sql>
标记内的 "script"。对于 PL/SQL 块,这显然是错误的,因为整个块需要被视为单个语句。
为此,请在 <sql>
标签中使用 splitStatements
属性:
<sql splitStatements="false">
DECLARE
....
END;
</sql>