Причина, по которой это происходит, заключается в том, что Oracle внутренне изменяет пустую строку на значения NULL
. Это связано с какой-то устаревшей причиной, и вы можете прочитать этот ответ , чтобы узнать историю.
Я не смог найти где-нибудь в документации JSON вариант с возможностью обойти эту проблему самостоятельно, хотя я был бы рад, если бы кто-то смог ее найти.
В качестве обходного пути к вашей проблеме, вы можете использовать функцию TRIM
для преобразования одного пробела в пустую строку.
V_OBJ.PUT('customerAccRef' , TRIM(' '));
что дает
{"customerAccRef":""}
Кажется, это работает как в версии Oracle 12.2; Я проверил на моей локальной машине и в Oracle
18c: DEMO , а также в 19c (LiveSQL онлайн)
Следует также отметить, что простое select TRIM(' ') from dual
всегда возвращает NULL
, что удивительно и, к счастью для вас, оно работает, как и ожидалось, с JSON