Oracle如何在将一个数据库中的所有表都加上某些字段。

1.如何查出数据库中所有表中不包含MODIFIER字段的表,
select distinct
TABLE_NAME from user_tab_columns a
where a.COLUMN_NAME <> 'MODIFIER' 得到的值为什么不正确。

2.我如何将得到的一组表同时加上MODIFIER NVARCHAR2(120)字段,即用得到的表结果集来替换下列语句中的表名。
declare
vstr_sql varchar2(2000):='alter table 表名 add MODIFIER NVARCHAR2(120) not null)';
begin
execute immediate vstr_sql;
end;
希望各位指教,3Q.
最新回答
春夜浅

2024-10-01 16:39:19

需要用存储过程解决。

如数据库中存在两张表,要给两张表都增加两个同样名称同样属性的字段,需要用以下代码:

1、创建测试用表test和test1

create table test
(id int,
name varchar2(10));

create table test1
(id int,
name varchar2(10));

2、要为两个表同时增加id1和name1字段。使用代码:

declare 
v_sql varchar2(2000);
v_table_name varchar2(30);
cursor c1 is select table_name from user_tables;
begin
open c1;
loop --提取一行数据到c1
fetch c1 into v_table_name;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false 
--取不到值c_job%notfound 是true
exit when c1%notfound;
v_sql:='alter table '||v_table_name||' add id1 int';
execute immediate v_sql;
v_sql:='alter table '||v_table_name||' add name1 varchar2(10)';
execute immediate v_sql;
end loop;--关闭游标
close c1;
end;

如图:

3、执行代码,成功无误后,查询test表和test1表结构:

碎疏影琼

2024-10-01 02:28:22

你的思路有点不准确,使用下面的语句就没有问题了
select distinct a.TABLE_NAME from user_tab_columns a where a.TABLE_NAME not in (SELECT b.TABLE_NAME from user_tab_columns b where b.COLUMN_NAME=‘MODIFIER’);
仔细想想你就明白为什么你写的不对了,希望能够解答你的疑惑。

提示:你并没有把包含指定列的表的情况除去
追问
我没弄清楚user_tab_columns视图包含的字段意义,谢谢了!现在理清楚了。
追答
嗯,思路很重要
夜雨入梦

2024-10-01 18:32:00

declare
vstr_sql varchar2(2000);
cursor c1 is select distinct a.TABLE_NAME TABLE_NAME from user_tab_columns a
where a.TABLE_NAME not in (SELECT b.TABLE_NAME from user_tab_columns b where b.COLUMN_NAME=‘MODIFIER’);
begin
for rec in c1 loop
vstr_sql varchar2(2000):='alter table '||rec.TABLE_NAME||' add MODIFIER NVARCHAR2(120) not null)';
execute immediate vstr_sql;
end loop;
end;