在所有表中创建视图和更改

Posted

技术标签:

【中文标题】在所有表中创建视图和更改【英文标题】:create view and alter in all tables 【发布时间】:2016-05-16 22:15:55 【问题描述】:

我正在尝试在过程中创建一个逻辑,使用游标为所有表创建数据库视图,并为架构中的所有表创建一个名为 HISTORY_DATE 的新列。我需要帮助构建下面的逻辑。

create or replace PROCEDURE ALTER_TABLES(
  RC OUT INT
  ,MSG OUT VARCHAR)
AS
BEGIN

DECLARE

CURSOR TBL_CUR IS
  SELECT TABLE_NAME FROM USER_TABLES;
TBL_REC TBL_CUR%ROWTYPE;  
SQL_STMT  VARCHAR(2000);

BEGIN
  OPEN TBL_CUR;
    LOOP
      FETCH TBL_CUR INTO TBL_REC;
      EXIT WHEN TBL_CUR%NOTFOUND;

      PRINT_DETAILS(TBL_REC.TABLE_NAME);            


      SQL_STMT:= 'ALTER TABLE '
         || TBL_REC.TABLE_NAME
         || ' ADD HISTORY_DATE DATE'
         || ' AND'
         || ' CREATE OR REPLACE VIEW all_tbl AS'
         || ' SELECT *'
         || ' FROM USER_TABLES'
         ;

      PRINT_DETAILS(SQL_STMT);
      EXECUTE IMMEDIATE SQL_STMT;


    END LOOP;
  CLOSE TBL_CUR;

  rollback;

END;

END;

【问题讨论】:

您需要将这些作为单独的语句进行。 【参考方案1】:

您只想创建一次视图;正如 Gordon Linoff 所说,你不能同时做两件事。所以在循环之外创建视图;像这样的东西(未经测试):

create or replace PROCEDURE ALTER_TABLES(RC OUT INT
                                    ,MSG OUT VARCHAR)
AS
BEGIN

DECLARE

CURSOR TBL_CUR IS
SELECT TABLE_NAME FROM USER_TABLES;
TBL_REC TBL_CUR%ROWTYPE;  
SQL_STMT  VARCHAR(2000);

BEGIN
          SQL_STMT  := 'CREATE OR REPLACE VIEW all_tbl AS'
                 || ' SELECT *'
                 || ' FROM USER_TABLES';
          PRINT_DETAILS(SQL_STMT);
          EXECUTE IMMEDIATE SQL_STMT;

          OPEN TBL_CUR;
              LOOP
                FETCH TBL_CUR INTO TBL_REC;
                EXIT WHEN TBL_CUR%NOTFOUND;

                PRINT_DETAILS(TBL_REC.TABLE_NAME);            


                 SQL_STMT:= 'ALTER TABLE '
                 || TBL_REC.TABLE_NAME
                 || ' ADD (HISTORY_DATE DATE)'
                 ;

                  PRINT_DETAILS(SQL_STMT);
                  EXECUTE IMMEDIATE SQL_STMT;


              END LOOP;
          CLOSE TBL_CUR;

--rollback;

END;

现在,我认为不需要创建视图 all_tbl,因为它是视图 USER_TABLES 的副本——所以只需使用 USER_TABLES——但我把它的创建留在那里如果您只需要来自USER_TABLES 的某些列或某些行,您就知道该放在哪里。

【讨论】:

我需要为所有表创建视图,这就是为什么我把它放在循环中。另外,我想让这个动态。我应该从用户那里寻求什么样的意见? 那么,您希望为 user_tables 中的每个表创建一个视图吗?用户的输入取决于......用户可能需要什么?一个想法是一个视图只能返回不超过 10 行的表,而不管有多少行。几乎所有其他内容都是特定于表的,并且难以编码。

以上是关于在所有表中创建视图和更改的主要内容,如果未能解决你的问题,请参考以下文章

在两个不同的表中创建具有相同列的视图 SQL

如何在另一个数据库中的多个数据库中创建多个表的单个视图?

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

在数据库中创建视图最多可以连接多少个表?连接表多了有啥影响…

带有按钮的表视图,可根据用户输入更改标签

为不存在的表创建视图