遇到的问题:    在一个typebody中,
    v_sql varchar2(200):=null;
    v_typtpdo is table of all_tab_columns.column_name%type;    for i in 1..v_typtpdo.count loop
         v_sql:=v_sql||v_typtpdo(i)||'=self.'||trim(v_typtpdo(i))||',';
    end loop;
    varstr:='update '||v_tablename||' set '||substr(v_sql,1,length(v_sql)-1)||' where me_id='||self.ME_ID;
  
    dbms_output.put_line(varstr);
输出varstr:
   update JL_PDO_SL
   set JLID            = self.JLID,
       DICKE           = self.DICKE,
       BREITE          = self.BREITE,
       FLAGCOMPLETE    = self.FLAGCOMPLETE,
       LAENGE          = self.LAENGE   
    where me_id = 146
现在,我的问题是:如何执行varstr
     execute immediate varstr;---会报错:无效字符;
     而我将sql语句:
     update JL_PDO_SL
   set JLID            = self.JLID,
       DICKE           = self.DICKE,
       BREITE          = self.BREITE,
       FLAGCOMPLETE    = self.FLAGCOMPLETE,
       LAENGE          = self.LAENGE   
    where me_id = 146;
    放到typebody 中,执行正常。
版主或高人,请给赐教:如何执行varstr;
   

解决方案 »

  1.   

    execute immediate 'begin  
      update JL_PDO_SL
       set
           DIAGONALE       = self.DIAGONALE,
           INNENDM         = self.INNENDM,
           OUTPUTEVENTID   = self.OUTPUTEVENTID
     where me_id = 146;  
       end;';
    将varstr值,直接放进去,仍报错:PL/SQL: ORA-00904: "SELF"."OUTPUTEVENTID": 标识符无效
      

  2.   

    在引号中self.OUTPUTEVENTID不能直接取
      

  3.   


    EXECUTE   IMMEDIATE   'update   '||tbl|| '   set   col1= '||   参数值   || '   where   ... ';
      

  4.   

    没指定self别名?
    varstr:='update '||v_tablename||'self set '||substr(v_sql,1,length(v_sql)-1)||' where me_id='||self.ME_ID;
    另外,语句结尾的分号,不要写成全角的分号!
    execute immediate varstr
      

  5.   

    首先,感谢阳阳、老兵的回复
    我的问题,没有说清楚,再次梳理:
    原本的设计思路:
    1、多张DB表jl_pdo_xxx(字段大部分一样,个别不同),对应一个type(该type的属性包含了多种表的所有字段)
    2、type属性的值由GUI,赋值;
    3、根据一个字段,可判断出具体那张表eg:jl_pdo_sl;
    4、可从 ALL_TAB_COLUMNS表中,得出该jl_pdo_sl的所有字段
    5、然后,拼写出varstr 
       v_sql varchar2(200):=null;
      v_typtpdo is table of all_tab_columns.column_name%type;
      v_typtpdo :=function_get_columnname(tablename varchar2);  for i in 1..v_typtpdo.count loop
      v_sql:=v_sql||v_typtpdo(i)||'=self.'||trim(v_typtpdo(i))||',';
      end loop;
      varstr:='update '||v_tablename||' set '||substr(v_sql,1,length(v_sql)-1)||' where me_id='||self.ME_ID;
    6、问题出现: 如何执行 varstr???
      

  6.   

    你这样子得到的sql文传值应该有问题吧:
    你本来是想用self.xxxxx(xxxxx代表每个字段的属性名?);
    你用DBMS_OUTPUT.PUT_LINE(self.'||trim(v_typtpdo(i))||')把值书出来看一下,看看这个值能打印出来吗?
      

  7.   

    for i in 1..v_typtpdo.count loop
      v_sql:=v_sql||v_typtpdo(i)||'=self.'||trim(v_typtpdo(i))||',';
      dbms_output.put_line(self.v_typtpdo(i)); --报错:Compilation errors for TYPE BODY   
                                           Error: PLS-00302: 必须声明 'V_TYPTPDO' 组件
      end loop;
      varstr:='update '||v_tablename||' set '||substr(v_sql,1,length(v_sql)-1)||' where me_id='||self.ME_ID||';';
    编译不过去,