Oracle 11g JSON库小于1的小数输出出错BUG 修复《JSON_UTIL_PKG》
Oracle 11g JSON库小于1的小数输出出错BUG 修复《JSON_UTIL_PKG》Oracle 11 中JSON数据的处理,采用的主要是第三方的JSON处理来实现,其中一个库JSON_UTIL_PKG,提供了两个函数:-- generate JSON from REF Cursorfunction ref_cursor_to_json (p_ref_cursor in sys_refc
·
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
更多推荐
已为社区贡献1条内容
所有评论(0)