如下,我想给所有的字段都去除空格,写了个过程,update的语句那里报错,希望指点;并且感觉自己的方法很笨,请问还有其它更简洁的方法么。declare
  cursor trim_cursor is
    select column_name from user_tab_columns where table_name = 'YONGHU';
  trim_col user_tab_columns.COLUMN_NAME%type;
begin
  open trim_cursor;
  loop
    fetch trim_cursor
      into trim_col;
    EXIT WHEN trim_cursor%NOTFOUND;
    update yonghu set trim_col = trim(trim_col);
  end loop;
  close trim_cursor;
end;

解决方案 »

  1.   

    我想把yonghu表的所有字段 都去掉前后空格,
    于是想游标出来每一个字段名,然后update,
    不知道这样是为什么出差;而且有没有更好的方法。
      

  2.   

    为什么要去掉啊,没有必要啊,
    查询的时候再进行TRIM就可以了,
    这个应该从你的源头进行控制吧,
      

  3.   

    每个字段都tirm一下 会累死的呀
      

  4.   


    不是用update语句吧?ALTER TABLE TB RENAME COLUMN A TO B通过动态语句来处理
      

  5.   

    这样写吧,要用execute immediate去动态执行SQL语句。
    要保证执行的用户有访问user_tab_columns这个表的权限。
    已经验证,是可行的,楼主结贴给分吧。declare
      cursor trim_cursor is
        select column_name from user_tab_columns where table_name = 'YONGHU';
      trim_col user_tab_columns.COLUMN_NAME%type;
      v_str varchar2(200);
    begin
      open trim_cursor;
      loop
        fetch trim_cursor
          into trim_col;
        EXIT WHEN trim_cursor%NOTFOUND;
        v_str:='update YONGHU set '|| trim_col || '= trim(' ||trim_col ||')';
        execute immediate v_str;
        --update yonghu set trim_col = trim(trim_col);
      end loop;
      close trim_cursor;
    end;
      

  6.   

    另外,多说一句,楼主如果只想给字段串字段做trim,是不是要在后面多加个条件:
    select * from user_tab_columns where table_name = 'SOP' and data_type like '%CHAR%';
      

  7.   

    否则:date字段被你一trim,时分秒就丢失了。number字段一trim,小数部分就丢失了
      

  8.   


    那我是不是用户replace(col,' ','')就能达到我的目的,也不会出现你说的情况了呢?
    我这样批量处理是因为数据全都是由excel贴进来的, 所以前后有好多空格什么的。
      

  9.   

    孺子可教。
    just do it;
      

  10.   

    妹妹你把 trim和trunc弄混了SQL> select sysdate,trim(sysdate),trim(1213.123) from dual;SYSDATE             TRIM(SYSDATE)       TRIM(121
    ------------------- ------------------- --------
    2011-09-12 21:34:36 2011-09-12 21:34:36 1213.123
      

  11.   


        v_str:='update YONGHU set '|| trim_col || '= trim(' ||trim_col ||')';
        execute immediate v_str;
        --update yonghu set trim_col = trim(trim_col);另外,我不是很明白,为什么我的语句不能执行呢?
      

  12.   

    动态执行是把你查出来的字段名称拼成sql语句,然后执行,因为有拼装,肯定是动态sql执行方法。而你的sql
    update yonghu set trim_col = trim(trim_col);数据库并不会知道你想要的是变量trim_col的值,他会把他当成数据库字段处理,就是当成名字叫
    trim_col的字段。初学者常犯的错误,仔细想想,不要把数据库当成智能的不得了,你扔一个变量在这里,不特殊写一下它是不会知道你是想要的是这个里面的值的。 
      

  13.   

    你想要你的sql执行也不难,在你的表里面增加一个叫 trim_col 的字段即可运行通过,但是结果并不是你想要的。
      

  14.   


    谢谢 完全明白了 和程序的变量一样 写sql的时候却突然这样异想天开了
      

  15.   

    replace(col,' ','')和trim(col)还是不一样的,trim只是把开头和结尾的空格去掉了;replace(col,' ','')会把字段中间的空格也去掉的