以下代码是存储过程中的一段。表名是通过变量tblname获取的。 jydate是该存储过程输入参数。 
  v_sqlstr1:='insert into info_error     
  select b.id,a.no,                      
  from '||tblname||' a,custinfo b 
  where a.bank_no=b.bank_no 
  and a.tdate=jydate';
  execute immediate v_sqlstr1;       --第6行
存储过程编译通过,但在执行的时候报错:“无效列名”,报错位置在最后一行,也就是第6行。
但是所有的表和列都是存在且正确的,我估计还是自己的动态sql写的有问题,尤其是在insert中
嵌套一个select,而动态表名tblname又是在select语句中的。
请教正确的实现方法,谢谢!

解决方案 »

  1.   

    你把v_sqlstr1这个字符串输出看了吗??
      

  2.   

    v_sqlstr1:='insert into info_error   
      select b.id,a.no                    
      from '||tblname||' a,custinfo b
      where a.bank_no=b.bank_no
      and a.tdate=jydate';
      execute immediate v_sqlstr1;可能是多了一个逗号
      

  3.   

    把你的v_sqlstr1输出来,直接去执行。
    十之八九是列名写错了。
      

  4.   

    v_sqlstr1:='insert into info_error  
      select b.id,a.no,                     
      from '||tblname||' a,custinfo b 
      where a.bank_no=b.bank_no 
      and a.tdate=jydate'; 
      execute immediate v_sqlstr1;
      

  5.   


    v_sqlstr1:='insert into info_error    
      select b.id,a.no,                      
      from '||tblname||' a,custinfo b 
      where a.bank_no=b.bank_no 
      and a.tdate=jydate';    --- debug the sql  dbms_output.put_line('[debug sql]||'v_sqlstr1||'[debug end]');
      ---execute immediate v_sqlstr1;      --第6行 
    SQL>set serveroutput on;
    SQL>exec procedurename;先把sql打出来看看就知道了==================================================================
    Inthirties关注Oracle数据库 维护 优化,安全,备份,恢复,迁移,故障处理如果你需要帮助或想和我一起学习的请联系
    联系方式QQ:370140387
    电子邮件:[email protected]
    网站: http://www.inthirties.com
      

  6.   

      v_sqlstr1 :='insert into info_error    
      select b.id,a.no                     
      from '||tblname||' a,custinfo b 
      where a.bank_no=b.bank_no 
      and a.tdate=to_date('''||jydate||''',''yyyymmdd'')';
      dbms_output.put_line(v_sqlstr1);
      execute immediate v_sqlstr1;
      

  7.   

    你在字符串里拼接的是字符串jydate 而不是jydate变量的值 应该是||jydate 而不是直接写在字符串里
      

  8.   

    谢谢大家,的确是jydate在语句中格式不对.