Неожидаемый результат конкатенации "||" оператором CLOB с NULL строкой

Недавно заметил, что приведенный ниже код, после обновления до версии 19c, ведет себя не так, как ожидалось:

declare
    nullval varchar2 (1) := null;
    clobval clob := '1234567890';
    someval varchar2(10) := '{test}';
    result varchar2 (32) := nullval||clobval||someval;
begin
    dbms_output.put_line ('result='||result);
end;
/
result={test}7890

Но это очевидно, что результат должен был быть: 1234567890{test}.

Кто-нибудь знает причину? Есть ли какая-нибудь функция обновления БД, или какое-то решение?


Свободный перевод вопроса Concatenate CLOB with null strings using "||" in PL/SQL от участника @K Chiu


Ответы (2 шт):

Автор решения: 0xdb

Это уже известный баг, добавте пустую строку в начало:

declare
    nullval varchar2 (1) := null;
    clobval clob := '1234567890';
    someval varchar2(10) := '{test}';
    result varchar2 (32) := ''||nullval||clobval||someval;
begin
    dbms_output.put_line ('result='||result);
end;
/
result=1234567890{test}

Свободный перевод ответа от участника @Sayan Malakshinov

→ Ссылка
Автор решения: 0xdb

Так как, результат конкантенации всегда будет VARCHAR2, то лучше извлечь содержимое CLOB как VARCHAR2 с макс. длиной исходя из макс. длин значений результата, других переменных, а также из замечаний к функции по длине возвращаемого символьного буфера DBMS_LOB.SUBSTR касателльно установленой кодировки. Так будет работать:

declare
    nullval varchar2 (1) := null;
    clobval clob := '1234567890';
    someval varchar2(10) := '{test}';
    result varchar2 (128); 
begin
    result := nullval||dbms_lob.substr (clobval, 96)||someval;
    dbms_output.put_line ('result='||result);
end;
/

result=1234567890{test}

И кроме того, это даст возможность избежать ошибки переполнения буфера:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

→ Ссылка