我想知道是否可以更改包含列名的模式中的每个表,例如'某些内容'在Oracle DB中。
答案 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;