Объедините CLOB с нулевыми строками, используя "||" в PL / SQL - PullRequest
2 голосов
/ 14 июля 2020

В последнее время я обнаружил, что приведенный ниже код ведет себя не так, как я ожидал. Для приведенного ниже кода я ожидаю, что v_result возвращает "1234567890 {test}". Однако недавно, когда мы обновились до Oracle DB 19 c, v_result возвращает '{test} 7890'. Кто-нибудь знает причину этого? Есть ли какая-либо функция обновления БД, о которой я не знаю? Кроме того, каким должно быть решение?

declare
    v_result varchar2(1000);
    v_open_tag varchar2(1);
    v_close_tag varchar2(1);
    v_string clob;
    v_string2 varchar2(10);
begin
    v_string := '1234567890';
    v_string2 := '{test}';
    v_result := v_open_tag || v_string || v_close_tag || v_string2;
    dbms_output.put_line('v_result='||v_result);
end;

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Это старая ошибка, замените ее на:

v_result := '' || v_open_tag || v_string || v_close_tag || v_string2;
0 голосов
/ 14 июля 2020

ТАКЖЕ другой способ решения проблемы: просто уменьшите plsql_optimize_level с уровня по умолчанию до 1:

--default: wrong results:
declare
    v_result varchar2(1000);
    v_open_tag varchar2(1);
    v_close_tag varchar2(1);
    v_string clob;
    v_string2 varchar2(10);
begin
    v_string := '1234567890';
    v_string2 := '{test}';
    v_result := v_open_tag || v_string || v_close_tag || v_string2;
    dbms_output.put_line('v_result='||v_result);
end;
/
v_result={test}7890

Исправлено с использованием plsql_optimize_level = 1:

alter session set plsql_optimize_level=1
/
declare
    v_result varchar2(1000);
    v_open_tag varchar2(1);
    v_close_tag varchar2(1);
    v_string clob;
    v_string2 varchar2(10);
begin
    v_string := '1234567890';
    v_string2 := '{test}';
    v_result := v_open_tag || v_string || v_close_tag || v_string2;
    dbms_output.put_line('v_result='||v_result);
end;
/
v_result=1234567890{test}
...