我试着给p_temp付了一个更新语句,结果可以执行,所以应该不是execute immediate的
问题。

解决方案 »

  1.   

    请问  p_cellname和p_CASENO对应的字段的数据类型是什么类型。如果你的类型有 CHAR型的话就可能有问题。
    例如 p_tablename = 'TABLE_NAME'
    p_cellname = 'LAST_NAME' p_cellvalue = 'WANG' p_CASENO = 12 那么你的语句将是UPDATE TABLE_NAME set LAST_NAME = WANG where CASENO=12这样 LAST_NAME = WANG 就错了
      

  2.   

    你说的问题我也想到了,我加过双引号,但是没什么效果。
    在SQL语句中,字符是用单引号引起来的,存储过程里有没有转义字符啊?
      

  3.   

    那就改成
    p_temp:='UPDATE '||TO_CHAR(p_tablename)||' set '||TO_CHAR(p_cellname)||'='''||TO_CHAR(p_cellvalue)||''' where CASENO='''||TO_CHAR(p_CASENO)||'''';
    试试。
      

  4.   

    BEGIN  
    p_temp:='UPDATE  '  ¦  ¦TO_CHAR(p_tablename)  ¦  ¦'  set  '  ¦  ¦TO_CHAR(p_cellname)  ¦  ¦'='  ¦  ¦TO_CHAR(p_cellvalue)  ¦  ¦'  where  CASENO='  ¦  ¦TO_CHAR(p_CASENO);  
    dbms_output.put_line(p_temp); 
    execute  immediate(p_temp);          
    end  ZS01WFAJCCCXLACPB_UPDATECELL;把字符串输出看看是否正确!或者直接用pl/sql developer 单步调试。  
     
      

  5.   

    p_CASENO varchar2,
    p_tablename varchar2,
    p_cellname varchar2,
    p_cellvalue varchar2
    参数都是 varchar2的可以把 TO_CHAR全部去掉。
      

  6.   

    create or replace procedure ZS01WFAJCCCXLACPB_UPDATECELL
    (
      p_CASENO varchar2,
      p_tablename varchar2,
      p_cellname varchar2,
      p_cellvalue varchar2
    )
    AS
      p_temp varchar2(500);
    BEGIN
      p_temp:='Update '||p_tablename||' Set '||p_cellname||'=:1 Where CASENO=:2';
      execute immediate p_temp using p_cellvalue,p_CASENO; 
    end;
      

  7.   

    谢谢大家,特别是hqwang77(haiqing)的帮助!