最近,我发现下面的代码不符合我的预期。对于下面的代码,我期望v_result返回'1234567890 {test}'。但是,最近,当我们升级到Oracle DB 19c时,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;
答案 0 :(得分:3)
那是旧错误,将其替换为:
v_result := '' || v_open_tag || v_string || v_close_tag || v_string2;
答案 1 :(得分:0)
另一种解决问题的方法:将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}