使用“ ||”将CLOB与空字符串连接在PL / SQL中

时间:2020-07-14 03:23:24

标签: oracle plsql

最近,我发现下面的代码不符合我的预期。对于下面的代码,我期望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;

2 个答案:

答案 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}
相关问题