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

来源:互联网 发布:网络地板防静电吗 编辑:程序博客网 时间:2024/06/03 21:43

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

-- generate JSON from REF Cursorfunction 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 statementfunction 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
原创粉丝点击