2016-11-21 219 views
0

我们正在尝试为我们的程序使用PL/JSON包,但它看起来像json.to_clob方法有一个错误。如果您尝试以下代码:如果json值是单个字符,Oracle pl/json to_clob()会失败

-- json to clob bug in pl/json package 
-- if json value is single character then that json value will not be shown in clob 
declare 
    l_Data_json_clob clob; 
    l_Data_json  json; 
begin 
    l_Data_json  := json(); 
    dbms_lob.createtemporary(l_Data_json_clob, true); -- create CLOB where result will be stored 

    l_Data_json.put('RESULT', '1');--put one character in json value 
    l_Data_json.to_clob(l_Data_json_clob);--put json result to clob 
    dbms_output.put_line(dbms_lob.substr(l_Data_json_clob, 255, 1));--not correct json - json value is empty 

    l_Data_json.put('RESULT', '22');--put two characters in json value 
    l_Data_json.to_clob(l_Data_json_clob);--put json result to clob 
    dbms_output.put_line(dbms_lob.substr(l_Data_json_clob, 255, 1));--correct json - more then one character 

    l_Data_json.put('RESULT', 1);--put one number in json value 
    l_Data_json.to_clob(l_Data_json_clob);--put json result to clob 
    dbms_output.put_line(dbms_lob.substr(l_Data_json_clob, 255, 1));--again correct json but with number instead of string 
end; 

您会看到由于某种原因,第一个json值为空。我们注意到,只有当json值是单个字符时才会发生。有没有解决这个问题的方法?

谢谢

回答

0

一些调试我发现的bug是JSON_PRINTER.ppString后。正确的代码应该是:

procedure ppString(elem json_value, buf in out nocopy clob, buf_str in out nocopy varchar2) is 
    offset number := 1; 
    v_str varchar(5000 char); 
    amount number := 5000; /*chunk size for use in escapeString. Maximum escaped unicode string size for chunk may be 6 one-byte chars * 5000 chunk size in multi-byte chars = 30000 1-byte chars. Maximum value may be 32767 1-byte chars */ 
begin 
    add_to_clob(buf, buf_str, case when elem.num = 1 then '"' else '/**/' end); 
    if(elem.extended_str is not null) then /*clob implementation*/ 
    while(offset <= dbms_lob.getlength(elem.extended_str)) loop 
     dbms_lob.read(elem.extended_str, amount, offset, v_str); 
     if(elem.num = 1) then 
     add_to_clob(buf, buf_str, escapeString(v_str)); 
     else 
     add_to_clob(buf, buf_str, v_str); 
     end if; 
     offset := offset + amount; 
    end loop; 
    else 
    if(elem.num = 1) then 
     while(offset**<=**length(elem.str)) loop 
      v_str:=substr(elem.str, offset, amount); 
      add_to_clob(buf, buf_str, escapeString(v_str)); 
      offset := offset + amount; 
     end loop; 
    else 
     add_to_clob(buf, buf_str, elem.str); 
    end if; 
    end if; 
    add_to_clob(buf, buf_str, case when elem.num = 1 then '"' else '/**/' end || newline_char); 
end; 
相关问题