如何使用变量编写程序?

时间:2014-12-24 17:04:13

标签: oracle stored-procedures plsql procedures

我的Oracle数据库中有两个模式。 第一个模式是"学生" schema,有4个表:

  1. 当然(身份证,姓名,日期,主人)
  2. 成绩(id,course_id,course_name,grade)
  3. master(id,stu_id,grade)
  4. 详细信息(id,stu_id,master_id,date)
  5. 此外,我还有另一个名称为" 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;
    

    但是我遇到了错误。

1 个答案:

答案 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;