在 with 子句中创建包含 pl/sql 定义的 mview

Posted

技术标签:

【中文标题】在 with 子句中创建包含 pl/sql 定义的 mview【英文标题】:creating mview containing pl/sql definitions in with clause 【发布时间】:2014-11-11 06:49:19 【问题描述】:

创建mview时如何在with子句中使用pl sql定义?

举例说明会很有帮助。

我也尝试了以下查询,但遇到了一些错误。

create table tab1
(
    fname varchar2(15) ,
    lname varchar2(15)
);


create or replace type user_data_type as object (val1 varchar2(20),val2 varchar2(20));
/

CREATE OR REPLACE Function get_fname_lname(n in varchar2)
RETURN user_data_type as
name user_data_type;
cursor buffer_cur is
select fname,lname from tab1 where fname=n;
BEGIN
    name := new user_data_type(null,null);
    OPEN buffer_cur;
    fetch buffer_cur into name.val1,name.val2;

    close buffer_cur;
    return name;
End;
/
select * from tab1;
select get_fname_lname(fname).val1  fname,get_fname_lname(fname).val2 from tab1;

drop materialized view mv1;
create materialized view mv1
with names as
(select get_fname_lname(fname).val1 fname,get_fname_lname(fname).val2 lname  from    tab1)
select fname,lname from names;
select * from mv1;

我看到了这个错误:

Error while creating mview:
ORA-00905: missing keyword

谁能指出可能是什么问题。

【问题讨论】:

【参考方案1】:

您可以在创建视图时尝试类似的操作,因为 oracle 不支持递归视图。 通过使用 with 子句,您已经创建了一个内联视图,并且您正在尝试为该视图创建一个在 oracle 中不受支持的物化视图

create materialized view mv1
 as
 select fname,lname from
(select get_fname_lname(fname).val1 fname,get_fname_lname(fname).val2 lname 
 from    tab1);

【讨论】:

谢谢。这有帮助..你能给我一些关于我的第一个问题的示例吗。 @starkk92 - 您想要创建物化视图的样本吗?创建视图时不应使用 with 子句,因为它会导致视图内视图

以上是关于在 with 子句中创建包含 pl/sql 定义的 mview的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中创建动态对象

在 PL/SQL 中创建匿名块

在存储过程中创建动态表而在 PL/SQL 块表中创建时权限不足[重复]

如何在 PL/SQL 中创建一个以时间段递增的循环

使用执行立即参数和可选参数在 PL/SQL 中创建对象实例

如何在sql中创建动态where子句?