缺少引号
decode(report_item_name,'||chi_name||',test_result,null)
改为
decode(report_item_name,'''||chi_name||''',test_result,null)

解决方案 »

  1.   

    解决这种问题的方法是你先将要执行的SQL语句打印出来,看有没有语法错误,因为你拼接的过程中很容易出错。其实你第一个语句就有问题,我帮你全部修改了一下,我试过,可以执行。create or replace procedure alter_table(eng_name in varchar2,
                                            chi_name in varchar2) as
      l_str1 varchar2(1000);
      l_str2 varchar2(1000);
    begin
      l_str1 := 'alter table xxxxx add ' || eng_name || ' number';
      dbms_output.put_line(l_str1);
      execute immediate l_str1;
      l_str2 := 'merge into xxxxx d
                        using(select decode(report_item_name,' || '''' ||
                chi_name || '''' || ',test_result,null) as a from yy) f
                        on(1=1)
                        when matched then
                        update set d.' || eng_name || '=f.a';
      dbms_output.put_line(l_str2);
      execute immediate l_str2;  commit;
    end alter_table;
      

  2.   

    楼主第一句是没有问题的,他那里写的不是4个单引号,而是 引号 双引 引号
    如果传入的字段名eng_name中存在特殊字符,如 - / \等,你这个就报错了,而楼主拼接的语句将字段用双引号引起来了,进行转义,是不报错的
      

  3.   

    严格来说,后面这个位置应该也用双引号引起来
    update set d.'||eng_name||'=f.a
      

  4.   

    楼主第一句是没有问题的,他那里写的不是4个单引号,而是 引号 双引 引号
    如果传入的字段名eng_name中存在特殊字符,如 - / \等,你这个就报错了,而楼主拼接的语句将字段用双引号引起来了,进行转义,是不报错的
    是不会报错,但是将列名加入特殊字符不是在给自己挖坑吗?不管从后期使用和维护都可能导致出问题,很简单的后面的merger就出问题了