Неожидаемый результат конкатенации "||" оператором 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 шт):
Это уже известный баг, добавте пустую строку в начало:
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
Так как, результат конкантенации всегда будет 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