0

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

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

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

更新 test_table 设置所有列 = trim(columns)

编辑:
我可以这样做:

UPDATE test_table
SET (col1,col2,col3,col4,col5) = (
SELECT col1,col2,col3,col4,col5
FROM test_table)

还有其他方法吗?

4

1 回答 1

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;

如果您对此有任何疑问,请告诉我。

于 2013-09-11T12:03:53.173 回答