Как поместить пустую строку в объект JSON_OBJECT_T?

Я пытаюсь добавить пустую строку в JSON_OBJECT_T, используя следующий код, но я получаю значение 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":""}

Может ли кто-нибудь предложить, какие изменения мне нужно сделать, чтобы передать пустую строку?


person Kinjan Bhavsar    schedule 04.04.2019    source источник


Ответы (1)


Причина, по которой это происходит, связана с тем, что Oracle внутренне изменяет пустую строку на значения NULL. Это связано с какой-то устаревшей причиной, и вы можете прочитать этот ответ, чтобы узнать историю.

Я не смог найти нигде в документации JSON возможность обойти эту конкретную проблему самостоятельно, хотя я был бы рад, если бы кто-то мог ее найти.

В качестве обходного пути к вашей проблеме вы можете использовать функцию TRIM для преобразования одного пробела в пустую строку.

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

который дает

{"customerAccRef":""}

Кажется, это работает как в версии Oracle 12.2; Я тестировал на своем локальном компьютере и в Oracle 18c: DEMO , а также в 19c (LiveSQL онлайн)

Здесь также следует отметить, что простой select TRIM(' ') from dual всегда возвращает NULL, что удивительно и, к счастью для вас, с JSON работает, как и ожидалось.

person Kaushik Nayak    schedule 04.04.2019
comment
Спасибо, я думал о том же, но проверял, смогу ли я обойтись без вызова какой-либо функции? Также у вас есть какие-либо предложения для моего другого поста? stackoverflow.com/ вопросы/54644055/ - person Kinjan Bhavsar; 04.04.2019
comment
@KinjanBhavsar: извините. Я не думаю, что когда-либо смогу ответить на вопрос, связанный с Oracle JSON (или любой SQL, если на то пошло), на который Крис Саксон не смог (и он еще не ответил на него после того, как вы добавили подробности в вопрос ). Вы можете задать новый вопрос, связав предыдущий с необходимой деталью, и, возможно, он или кто-то другой сможет вам помочь. Что касается этого конкретного вопроса, вам решать, хотите ли вы дождаться других ответов (может быть, сам Крис может, не используя TRIM) или продолжить с этим. - person Kaushik Nayak; 04.04.2019
comment
Я использовал обходной путь, предоставленный вами, и он работает нормально. Спасибо. Также, если вы можете предложить что-нибудь для stackoverflow.com/questions/55535454/ это было бы очень полезно. - person Kinjan Bhavsar; 05.04.2019