我只是想问下面的更新是否有替代方法。
更新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)
还有其他方法吗?
答案 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;
如果您对此有任何疑问,请与我们联系。