【问题标题】:How to trim all columns in all rows in all tables of type string?如何修剪所有字符串类型表中所有行中的所有列?
【发布时间】:2011-02-19 14:57:42
【问题描述】:

在 Oracle 10g 中,有没有办法在 PL/SQL 中执行以下操作?

for each table in database
  for each row in table
    for each column in row
      if column is of type 'varchar2'
        column = trim(column)

谢谢!

【问题讨论】:

标签: oracle string plsql varchar trim


【解决方案1】:

当然,进行大规模动态更新具有潜在的危险性和耗时性。但这里是你如何生成你想要的命令的方法。这是针对单个模式的,只会构建命令并输出它们。您可以将它们复制到脚本中并在运行前查看它们。或者,您可以将 dbms_output.put_line( ... ) 更改为 EXECUTE IMMEDIATE ... 以让此脚本在生成时执行所有语句。

SET SERVEROUTPUT ON

BEGIN
  FOR c IN
    (SELECT t.table_name, c.column_name
       FROM user_tables t, user_tab_columns c
       WHERE c.table_name = t.table_name
         AND data_type='VARCHAR2')
  LOOP

    dbms_output.put_line(
                      'UPDATE '||c.table_name||
                      ' SET '||c.column_name||' = TRIM('||c.column_name||') WHERE '||
                      c.column_name||' <> TRIM('||c.column_name||') OR ('||
                      c.column_name||' IS NOT NULL AND TRIM('||c.column_name||') IS NULL)'
                     );
  END LOOP;
END;

【讨论】:

  • USER_TAB_COLUMNS 包含在表和视图中找到的列。要完成这项工作,您需要过滤掉视图。
  • 如果您的数据库包含许多列类型为 VARCHAR2 的表,则 dbms_output.put_line 的缓冲区不足以容纳所有 UPDATE 语句,因此存储 UPDATE 语句会很方便在 Oracle 表中,使用 INSERT 语句而不是 DBMS_OUTPUT.PUT_LINE 语句。
  • 同意,小鸡,但是对于我只有几张桌子,我只是增加了输出缓冲区,它工作正常。
【解决方案2】:

大概您想对架构中的每一列执行此操作,而不是在数据库中。尝试对字典表执行此操作将是一个坏主意...

declare
  v_schema varchar2(30) := 'YOUR_SCHEMA_NAME';
  cursor cur_tables (p_schema_name varchar2) is
    select owner, table_name, column_name 
    from all_tables at,
      inner join all_tab_columns atc
        on at.owner = atc.owner 
          and at.table_name = atc.table_name
    where atc.data_type = 'VARCHAR2'
      and at.owner = p_schema;
begin
  for r_table in cur_tables loop
    execute immediate 'update ' || r.owner || '.' || r.table_name
      || ' set ' || r.column_name || ' = trim(' || r.column_name ||');';
  end loop;
end;

这仅适用于首先是 VARCHAR2 的字段。如果您的数据库包含 CHAR 字段,那么您就不走运了,因为 CHAR 字段总是被填充到它们的最大长度。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多