我可以更新一组中的所有列

时间:2013-09-11 11:32:15

标签: oracle

我只是想问下面的更新是否有替代方法。

  

更新test_table设置
  col 1 = trim(col1),
  col 2 = trim(col2),
  col 3 = trim(col3),
  col 4 = trim(col4),
  col 5 = trim(col5),

在我的真实表中,大约有20列,可能更多。有没有一种快速方法可以一次性修剪所有列? 如果存在,寻求类似的查询:

  

update test_table set all columns = trim(columns)

编辑:
我可以这样做:

  

更新test_table
  SET(col1,col2,col3,col4,col5)=(
    SELECT col1,col2,col3,col4,col5
    来自test_table)

还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

我知道没有SQL语法可以让您快速轻松地执行此操作。

您可以这样做的一种方法是编写PL / SQL块以从系统视图中选择给定表的列名,例如user_tab_cols并将它们写入变量以构建动态运行的SQL代码。说实话,除非你有多个表来执行此操作或列的负载,否则手动编写查询可能会更容易。

编辑 - 以下是您想要的代码

declare
   v_table varchar2(50) := 'test_table';
   v_sql varchar2(2000) := null;

   cursor c_cols(p_table varchar2) is
      select c.column_name as col
        from user_tab_cols c
       where c.table_name = upper(p_table)
       order by c.column_id;

begin
   -- write first line of sql...
   v_sql := 'update ' || v_table || ' set' || chr(10);

   -- loop through col names to add each col into update statement...
   for l_c_cols in c_cols(v_table) loop
       v_sql := v_sql || l_c_cols.col || ' = trim(' || l_c_cols.col || '),' || chr(10);
   end loop;

   -- remove last comma...
   v_sql := substr(v_sql,1,length(v_sql)-2);

   -- run dynamic sql...
   dbms_output.put_line(v_sql);
   begin
      execute immediate v_sql;
      commit;
   end;

end;

如果您对此有任何疑问,请与我们联系。