我的Oracle数据库中有两个模式。 第一个模式是"学生" schema,有4个表:
此外,我还有另一个名称为" ALLDATA"的模式,我在此模式中有一个名为" table_schema"的表。这个表的结构如下所示。(这个表只有一些STUDENT模式表的名称。)
id table_name
---------- ----------
1 course
2 grade
3 master
我有另一个名为view_schema的表:
enter code here
id schema_name
---------- ----------
1 STUDENT
我想在ALLDATA架构中编写一个循环on" table_schema"并从STUDENT模式创建表名的视图。 其实我希望我的程序做下面的事情:
create or replace PROCEDURE VIEWINSTRACTOR
is
begin
for j in (select SCHEMA_NAME from ALLDATA.VIEW_SCHEMA)
loop
for i in (select table_name from ALLDATA.VIEW_TABLE)
loop
execute immediate 'create or replace view ALLDATA.'|| i.table_name
||' as select * from '|| j.SCHEMA_NAME.i.table_name;
end loop;
end loop;
end;
但是我遇到了错误。
答案 0 :(得分:1)
当我们想要从不同的输入数据驱动一系列语句时,我们需要使用动态SQL。我们还需要使用动态SQL在存储过程中执行DDL。
我在引用光标投影时更正了语法。我还建议你使用CREATE OR REPLACE VIEW语法,因为它更健壮。
create or replace procedure createViewTables
is
begin
for i in (select table_name from ALLDATA.table_schema)
loop
execute immediate 'create or replace view ALLDATA.'|| i.table_name
||' as select * from STUDENT.'|| i.table_name;
end loop;
end;
请注意,此过程将很乐意尝试创建视图。但是,只有当STUDENT已将其表的权限授予ALLDATA时,该过程才会成功。否则它会投掷ORA-00942: table or view does not exist
。
“实际上我希望我的程序可以执行以下操作:”
奖励回答,即使没有更多积分,因为它是圣诞节(至少在这个时区):)
动态SQL比静态SQL更难,因为我们需要使我们的实际语句正确,然后我们需要反汇编为样板和变量。对于不熟悉SQL的人来说,这更加棘手,因为他们缺乏足够的理解来发现语法错误。
在您的情况下,问题是如何将模式名称与表名联系起来。它们之间的点需要在实际的SQL语句中,因此它必须是样板文本。你需要的是这句话:
execute immediate 'create or replace view ALLDATA.'|| i.table_name
||' as select * from '|| j.SCHEMA_NAME ||'.'|| i.table_name;