2

我正在尝试JSON_OBJECT_T使用以下代码向 a 添加一个空字符串,但我得到null的是值而不是空字符串。

DECLARE
   V_OBJ JSON_OBJECT_T;
BEGIN
   V_OBJ := JSON_OBJECT_T();
   V_OBJ.PUT('customerAccRef','');
   DBMS_OUTPUT.PUT_LINE(V_OBJ.stringify);
END;

当我这样做时,我得到以下 json

{"customerAccRef":null}

我想要输出如下

{"customerAccRef":""}

有人可以建议我需要做些什么来传递一个空字符串吗?

4

2 回答 2

4

发生这种情况的原因是 Oracle 在内部将空字符串更改为NULL值。这是由于一些遗留原因,您可以阅读此答案以了解历史。

我在 JSON 文档中找不到任何可以自己绕过这个特定问题的选项,但如果有人能找到它,我会很高兴。

作为您的问题的解决方法,您可以使用TRIM函数将单个空格转换为空白字符串。

V_OBJ.PUT('customerAccRef' , TRIM(' '));

这使

{"customerAccRef":""}

这似乎在 Oracle 12.2 版本中都有效;我在本地机器和 Oracle 18c 中进行了测试:DEMO以及 19c(LiveSQL 在线)

这里还要注意的一点是,一个简单的select TRIM(' ') from dual总是返回NULL,这对你来说是令人惊讶和幸运的,它可以按预期与 JSON 一起工作

于 2019-04-04T14:38:35.223 回答
0

在 19c 中,使用put(..., '')你会得到一个空字符串。使用put_null, 或put(..., to_char(null))put(..., <unitializedString>)您将获得“真正的”空值。

DECLARE
   V_OBJ JSON_OBJECT_T;
   V_STRING VARCHAR2(20);
BEGIN
   V_OBJ := JSON_OBJECT_T();
   V_OBJ.PUT('doubleSingleQuotes','');
   V_OBJ.PUT('toCharNull',to_char(null));
   V_OBJ.PUT('uninitializedStringVariable',v_string);
   V_OBJ.PUT_null('null');
   V_OBJ.PUT('trimSpace', trim(' '));
   DBMS_OUTPUT.PUT_LINE(V_OBJ.stringify);
END;

...给出:

{"doubleSingleQuotes":"","toCharNull":null,"uninitializedStringVariable":null,"null":null,"trimSpace":""}
于 2022-03-01T08:15:09.840 回答