更改名称类似于'?的模式的每个表格。

时间:2016-06-23 08:34:46

标签: sql oracle

我想知道是否可以更改包含列名的模式中的每个表,例如'某些内容'在Oracle DB中。

2 个答案:

答案 0 :(得分:3)

您可以使用循环迭代USER_TAB_COLUMNS并生成SQL语句:

declare
  l_SQL varchar2(4000);
begin
  for cur in (
    select table_name, column_name 
     from user_tab_columns utc
    where upper(utc.column_name) like '%SOMETHING%')
  loop
    l_SQL := 'alter table ' || cur.table_name || ' drop column ' || cur.column_name;
    dbms_output.put_line(l_SQL);
    -- execute immediate l_SQL; -- UNCOMMENT TO RUN; DO NOT DO THIS IN PRODUCTION!
  end loop;
end;

答案 1 :(得分:2)

是的,这是可能的。您必须从execute immediate例程动态创建DDL或DML和PL/SQL。使用“alter”是指更改表列的内容还是更改列属性?

编辑:

您可以使用Frank's Routine,但是对于列修改,您可以这样做。

l_SQL := 'alter table ' || cur.table_name || 
         ' modify (' || cur.column_name || ' varchar2(50)); ';

我同意Frank不要盲目修改列,使用dbms输出作为生成的脚本。

EDIT2:

还有一件事我意识到了。表user_tab_columns还为您提供了视图列。您可以通过加入user_tables

来排除它们
set serveroutput on
declare
  l_SQL varchar2(4000);
begin
  for cur in (
    select utc.table_name, utc.column_name 
     from user_tab_columns utc
     join user_tables      ut  on  (UT.TABLE_NAME = utc.table_name)
    where upper(utc.column_name) like '%SO')
  loop
    l_SQL := 'alter table ' || cur.table_name || ' modify (' || cur.column_name || ' varchar2(50)); ';
    dbms_output.put_line(l_SQL);
    -- execute immediate l_SQL; -- UNCOMMENT TO RUN; DO NOT DO THIS IN PRODUCTION!
  end loop;
end;