Oracle 11g JSON库小于1的小数输出出错BUG 修复《JSON_UTIL_PKG》

Oracle 11 中JSON数据的处理,采用的主要是第三方的JSON处理来实现,其中一个库JSON_UTIL_PKG,提供了两个函数:

-- generate JSON from REF Cursor
function ref_cursor_to_json (p_ref_cursor in sys_refcursor,
                             p_max_rows in number := null,
                             p_skip_rows in number := null) return json_list;

-- generate JSON from SQL statement
function sql_to_json (p_sql in varchar2,
                      p_max_rows in number := null,
                      p_skip_rows in number := null) return json_list;

这两个函数的本质是一样的,一个将cursor数据返回,另一个是动态SQL语句,查询后返回结果列表,但从安全与开发的角度讲,使用CURSOR会更安全和方便一点,动态SQL语句则有一定的潜在风险。

BUG/BUG/BUG:
但我们发现这个方法在使用的时候,如果某字段的值为小于1的一个浮点数时,就会可能报错。经查看其内部实现时候,我们发现,它在转换时候采用的方法是:先将结果数据按XSL模板,转换成XML数据格式,再从XML格式中将数据提取转换成JSON格式。

在转换成XML时候,小于1的数字会去掉前面的0,所以在做转换成JSON时,解析报错。

找到问题原因即可修改,找到其数字处理定义部分:

  <xsl:template match="text()[not(string(number())='NaN' or
                      ( starts-with(.,'0' ) and . != '0' and not(starts-with(.,'0.' )) ) or
                      ( starts-with(.,'-0' ) and . != '-0' and not(starts-with(.,'-0.' )) )
                      )]">
    <xsl:value-of select="."/>
  </xsl:template>

改为自动补0:如果是小数且没有前置0的话,就补0,否则就原样输出不变,确保不出错:

  <xsl:template match="text()[not (string(number())='NaN')]">
    <xsl:choose>
      <xsl:when test="starts-with(., '.')">
          <xsl:value-of select="concat('0', .)"/>
      </xsl:when>
      <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
    </xsl:choose>
  </xsl:template>  

到此整个修改完成,重新编译或另存成一个包(我就是这样做了^&^)
Q:380105206

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值