plsql 开发实战问题一: 如何更新一个表的所有列

来源:互联网 发布:淘宝客服规范用语 编辑:程序博客网 时间:2024/05/22 12:22
安生(970078354) 18:18:03

有没有方法把表中的字段的所有数据中的某个字母替换成其他的,不用判断是哪一列的,只要表中出现某个字母就直接替换成其他的呢


今天群里有个学生问,如何有办法更新一个表中的所有列:

很简单哈:


轻松加愉快写完代码:

declare
  v_sql varchar2(200);
  v_sql1 varchar2(200);
begin
  for i in (select column_name from
 user_tab_cols where table_name in ('EMP'))
  loop
    v_sql :='update emp set '||i.column_name||
    '=replace('||i.column_name||',''a'',''b'')';
    execute immediate v_sql;
   --dbms_output.put_line(v_sql);
  end loop;
end;


如果我们再复杂点, 如果要传表名,可以不?

那也很简单:


 create or replace procedure rep_1(v_t varchar2,v_o varchar2) is
delcare
v_tname varchar2(200);
v_oname varchar2(200);
cursor c_col is select column_name from dba_tab_columns where table_name= v_tname and owner= v_oname;
begin
v_tname := v_t;
v_oname := v_o;
for x in c_col loop
dbms_output.put_line(x.column_name);
end loop;
end;
/

create table test_rep(t1 varchar2(10),t2 varchar2(10),t3 varchar2(10));

insert into test_rep values('aacde','bdace','cdtga');
insert into test_rep values('aaaa','bytbae','cdataga');

SQL> select * from test_rep;

T1         T2         T3
---------- ---------- ----------
aacde      bdace      cdtga
aaaa       bytbae     cdataga

grant select on dba_tab_columns to scott;

create or replace procedure rep_1(v_t in varchar2,v_o in varchar2) is
cursor c_col is select column_name from dba_tab_columns where table_name=v_t and owner=v_o;
v_sql varchar2(200);
begin
for x in c_col loop
v_sql := 'update '||v_t||' set '||x.column_name||' = replace('||x.column_name||',''a'',''b'')';
execute immediate v_sql;
end loop;
end;
/

SQL> exec rep_1('TEST_REP','SCOTT');

PL/SQL procedure successfully completed.

SQL> select * from test_rep;

T1         T2         T3
---------- ---------- ----------
bbcde      bdbce      cdtgb
bbbb       bytbbe     cdbtbgb

1 0
原创粉丝点击