使用Liquibase创建Snowflake存储过程执行update报错如何解决
问题原因
syntax error line 5 at position 5 unexpected '$'. [Failed SQL: (1003) create or replace procedure SP_TEST_AZURE()
returns string
language javascript
as
$$
var sql_cmd
这个错误是Liquibase默认启用了变量替换功能,会将$识别为自定义变量的前缀,尝试解析$$里的内容为变量,最终导致SQL语法解析失败。此外Snowflake存储过程内部的JavaScript代码包含分号,Liquibase默认按分号拆分SQL语句也可能引发执行异常。
解决方案
按优先级推荐以下配置调整:
方案1:全局关闭Liquibase变量替换
在你的liquibase.properties配置文件中新增如下配置:liquibase.enableSubstitution=false该方案适用于所有变更脚本中没有使用Liquibase自定义变量的场景,配置后无需修改SQL语句即可正常执行。
方案2:仅针对当前变更集调整配置
如果需要保留全局变量替换功能,可以对对应存储过程的changeSet做如下调整:- 给changeSet添加
splitStatements="false"属性,关闭SQL语句拆分,避免拆分存储过程内部的分号 - 用
<![CDATA[ ]]>标签包裹整个存储过程创建语句,避免Liquibase解析$特殊字符
示例(XML格式changelog):
<changeSet id="create-sp-test" author="yourname" splitStatements="false"> <sql><![CDATA[ create or replace procedure SP_TEST_AZURE() returns string language javascript as $$ var sql_cmd -- 后续存储过程代码 $$; ]]></sql> </changeSet>- 给changeSet添加
内容的提问来源于stack exchange,提问作者Kannan Kandasamy
相关产品推荐
相关产品推荐

