给所有字段都trim一下的存储过程

xiedi1209 2011-09-11 05:17:12
如下,我想给所有的字段都去除空格,写了个过程,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;

...全文
392 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hao1hao2hao3 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiedi1209 的回复:]
我想把yonghu表的所有字段 都去掉前后空格,
于是想游标出来每一个字段名,然后update,
不知道这样是为什么出差;而且有没有更好的方法。
[/Quote]

不是用update语句吧?

ALTER TABLE TB RENAME COLUMN A TO B

通过动态语句来处理。。。
yoyoapple9 2011-09-12
  • 打赏
  • 举报
回复
replace(col,' ','')和trim(col)还是不一样的,trim只是把开头和结尾的空格去掉了;replace(col,' ','')会把字段中间的空格也去掉的
[Quote=引用 9 楼 benchim888 的回复:]

孺子可教。
just do it;
引用 8 楼 xiedi1209 的回复:
引用 7 楼 yoyoapple9 的回复:

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


那我是不是用户replace(col,' ','')就能达到我的目的,也不会出现你说的情况了呢?
我这样批量处理是因为数据全都是由excel贴进来的, ……
[/Quote]
yoyoapple9 2011-09-12
  • 打赏
  • 举报
回复
不好意思,确实是搞混了
[Quote=引用 10 楼 benchim888 的回复:]

妹妹你把 trim和trunc弄混了
SQL code

SQL> select sysdate,trim(sysdate),trim(1213.123) from dual;

SYSDATE TRIM(SYSDATE) TRIM(121
------------------- ------------------- --------
2011-09-1……
[/Quote]
xiedi1209 2011-09-12
  • 打赏
  • 举报
回复
每个字段都tirm一下 会累死的呀
xiedi1209 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 benchim888 的回复:]

动态执行是把你查出来的字段名称拼成sql语句,然后执行,因为有拼装,肯定是动态sql执行方法。

而你的sql
update yonghu set trim_col = trim(trim_col);

数据库并不会知道你想要的是变量trim_col的值,他会把他当成数据库字段处理,就是当成名字叫
trim_col的字段。

初学者常犯的错误,仔细想想,不要把数据库当成智能的不得……
[/Quote]

谢谢 完全明白了 和程序的变量一样 写sql的时候却突然这样异想天开了
BenChiM888 2011-09-12
  • 打赏
  • 举报
回复
你想要你的sql执行也不难,在你的表里面增加一个叫 trim_col 的字段即可运行通过,但是结果并不是你想要的。
BenChiM888 2011-09-12
  • 打赏
  • 举报
回复
动态执行是把你查出来的字段名称拼成sql语句,然后执行,因为有拼装,肯定是动态sql执行方法。

而你的sql
update yonghu set trim_col = trim(trim_col);

数据库并不会知道你想要的是变量trim_col的值,他会把他当成数据库字段处理,就是当成名字叫
trim_col的字段。

初学者常犯的错误,仔细想想,不要把数据库当成智能的不得了,你扔一个变量在这里,不特殊写一下它是不会知道你是想要的是这个里面的值的。



[Quote=引用 11 楼 xiedi1209 的回复:]
引用 5 楼 yoyoapple9 的回复:

这样写吧,要用execute immediate去动态执行SQL语句。
要保证执行的用户有访问user_tab_columns这个表的权限。
已经验证,是可行的,楼主结贴给分吧。
SQL code

declare
cursor trim_cursor is
select column_name from user_tab_colu……
[/Quote]
xiedi1209 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yoyoapple9 的回复:]

这样写吧,要用execute immediate去动态执行SQL语句。
要保证执行的用户有访问user_tab_columns这个表的权限。
已经验证,是可行的,楼主结贴给分吧。
SQL code

declare
cursor trim_cursor is
select column_name from user_tab_columns where table_name =……
[/Quote]

v_str:='update YONGHU set '|| trim_col || '= trim(' ||trim_col ||')';
execute immediate v_str;
--update yonghu set trim_col = trim(trim_col);

另外,我不是很明白,为什么我的语句不能执行呢?
BenChiM888 2011-09-12
  • 打赏
  • 举报
回复
妹妹你把 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



[Quote=引用 7 楼 yoyoapple9 的回复:]
否则:date字段被你一trim,时分秒就丢失了。number字段一trim,小数部分就丢失了
[/Quote]
BenChiM888 2011-09-12
  • 打赏
  • 举报
回复
孺子可教。
just do it;
[Quote=引用 8 楼 xiedi1209 的回复:]
引用 7 楼 yoyoapple9 的回复:

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


那我是不是用户replace(col,' ','')就能达到我的目的,也不会出现你说的情况了呢?
我这样批量处理是因为数据全都是由excel贴进来的, 所以前后有好多空格什么的。
[/Quote]
xiedi1209 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yoyoapple9 的回复:]

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

那我是不是用户replace(col,' ','')就能达到我的目的,也不会出现你说的情况了呢?
我这样批量处理是因为数据全都是由excel贴进来的, 所以前后有好多空格什么的。
yoyoapple9 2011-09-12
  • 打赏
  • 举报
回复
否则:date字段被你一trim,时分秒就丢失了。number字段一trim,小数部分就丢失了
yoyoapple9 2011-09-12
  • 打赏
  • 举报
回复
另外,多说一句,楼主如果只想给字段串字段做trim,是不是要在后面多加个条件:
select * from user_tab_columns where table_name = 'SOP' and data_type like '%CHAR%';
yoyoapple9 2011-09-12
  • 打赏
  • 举报
回复
这样写吧,要用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;
iqlife 2011-09-11
  • 打赏
  • 举报
回复
为什么要去掉啊,没有必要啊,
查询的时候再进行TRIM就可以了,
这个应该从你的源头进行控制吧,
xiedi1209 2011-09-11
  • 打赏
  • 举报
回复
我想把yonghu表的所有字段 都去掉前后空格,
于是想游标出来每一个字段名,然后update,
不知道这样是为什么出差;而且有没有更好的方法。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧