Informatica预/后SQL执行PostgreSQL匿名PL/SQL块报错求助
解决Informatica中PostgreSQL匿名DO块的$$分隔符冲突问题
问题背景
在Informatica映射的源限定符Pre-SQL/Post-SQL中执行PostgreSQL匿名PL/pgSQL块时,使用标准的do $$ ... end $$;语法会触发CMN_1022错误,提示“未终止的美元引号字符串”。原因是Informatica默认将$识别为映射参数的占位符,而非PostgreSQL的美元引号分隔符。尝试在$间添加自定义标签、用单/双引号转义$均无效,且不想通过存储过程实现需求。
可行解决方案
方案1:用单引号替代美元引号(推荐简单场景)
将DO块的美元引号替换为单引号,同时对块内的单引号进行转义(PostgreSQL中使用两个连续单引号表示一个单引号)。示例代码:
do ' begin raise notice ''>>>>>>>>>>>>>>>>>>Test Proc''; end';
适用场景:块内无多层单引号嵌套的简单逻辑,语法简洁易维护。
方案2:通过CHR函数动态生成美元引号(适用于复杂嵌套场景)
利用PostgreSQL的CHR(36)函数生成$符号,绕开Informatica的参数解析机制。将DO块的分隔符用CHR函数拼接,示例代码:
execute 'do ' || chr(36) || chr(36) || ' begin raise notice ''>>>>>>>>>>>>>>>>>>Test Proc''; end ' || chr(36) || chr(36) || ';';
适用场景:块内存在多层单引号嵌套,用单引号转义会导致代码可读性差的情况。
方案3:禁用Informatica的$参数解析(全局设置,需谨慎)
如果当前映射及会话中未使用任何$开头的映射参数/变量,可以在会话属性中找到Enable $ Syntax选项,将其设置为False。此设置会让Informatica不再解析$为参数占位符,此时原有的do $$ ... end $$;代码可直接执行。
注意:该设置为会话级全局配置,若其他逻辑依赖$参数,会导致参数无法正常解析,需谨慎使用。
内容的提问来源于stack exchange,提问作者SteveTR
相关产品推荐
相关产品推荐

