在所有表中创建视图和更改
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 行的表,而不管有多少行。几乎所有其他内容都是特定于表的,并且难以编码。以上是关于在所有表中创建视图和更改的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表