Informatica Developer Client 10.5中SQL查询覆盖参数单引号转义异常求助
Informatica Developer Client 10.5 查询覆盖参数化单引号问题解决
问题场景
在源转换中使用字符串参数存储查询覆盖SQL时,执行数据查看器发现SQL中的单引号被自动转义为两个单引号,导致XMLTABLE语法错误:
原参数SQL:
SELECT /*+ PARALLEL(16) NO_XML_QUERY_REWRITE*/ RECID, Q.* FROM F_POSTING_RESTRICT x, XMLTABLE ('/row' PASSING XMLRECORD COLUMNS RESTRICTION_TYPE VARCHAR2 (6) PATH 'c2', DISPO_OFFICER VARCHAR2 (4) PATH 'c3' )Q
执行后生成错误SQL:
SELECT /*+ PARALLEL(16) NO_XML_QUERY_REWRITE*/ RECID, Q.* FROM F_POSTING_RESTRICT x, XMLTABLE (''/row'' PASSING XMLRECORD COLUMNS RESTRICTION_TYPE VARCHAR2 (6) PATH ''c2'', DISPO_OFFICER VARCHAR2 (4) PATH ''c3'' )Q
解决方法
方法1:使用表达式参数替代字符串参数
- 在映射中创建表达式类型参数(而非字符串参数)。
- 参数值通过
CHR(39)函数拼接生成单引号,完整表达式如下:
'SELECT /*+ PARALLEL(16) NO_XML_QUERY_REWRITE*/ RECID, Q.* FROM F_POSTING_RESTRICT x, XMLTABLE (' || CHR(39) || '/row' || CHR(39) || ' PASSING XMLRECORD COLUMNS RESTRICTION_TYPE VARCHAR2 (6) PATH ' || CHR(39) || 'c2' || CHR(39) || ', DISPO_OFFICER VARCHAR2 (4) PATH ' || CHR(39) || 'c3' || CHR(39) || ' )Q'
- 在源转换的查询覆盖中引用该参数(格式如
$$ParamName)。
表达式参数会解析CHR(39)生成单引号,最终输出的SQL无多余转义。
方法2:调整字符串参数的单引号转义规则
若必须使用字符串参数,需在参数值中用三个单引号表示最终SQL中的一个单引号,示例参数SQL:
SELECT /*+ PARALLEL(16) NO_XML_QUERY_REWRITE*/ RECID, Q.* FROM F_POSTING_RESTRICT x, XMLTABLE ('''/row''' PASSING XMLRECORD COLUMNS RESTRICTION_TYPE VARCHAR2 (6) PATH '''c2''', DISPO_OFFICER VARCHAR2 (4) PATH '''c3''' )Q
Informatica解析时会将连续三个单引号转换为一个单引号,生成符合语法要求的SQL。
注意事项
- 字符串参数无法解析函数,直接写入
CHR(39)会被当作普通文本带入查询,请勿使用。 - 验证替换后的SQL可在数据库客户端正常执行后,再在Informatica中测试。
内容的提问来源于stack exchange,提问作者Nayera Sakr
相关产品推荐
相关产品推荐

