我们可以创建一个关于过程、函数、触发器、包的视图吗?

Posted

技术标签:

【中文标题】我们可以创建一个关于过程、函数、触发器、包的视图吗?【英文标题】:can we create a view on procedure,function,trigger,package? 【发布时间】:2012-06-20 12:06:07 【问题描述】:

我是 SQL 新手,正在经历一些视图分配。 我对以下观点有一些疑问:

我们可以创建一个关于过程、函数、触发器、包或序列、索引、同义词的视图吗? 如果是,那怎么办?

【问题讨论】:

您查看过 Oracle 文档吗? 先告诉我们你想做什么 【参考方案1】:

这是一个基于 FUNCTION 的视图示例(注意:不是 PIPELINED 函数,尽管它可能是):

create or replace type dept_t is object (deptno number, dname varchar2(10));

create or replace type dept_tab_t is table of dept_t;

create or replace function depts_fun 
return dept_tab_t
is 
  l_dept_tab dept_tab_t := dept_tab_t();
begin
  for r in (select deptno, dname from dept)
  loop
    l_dept_tab.extend;
    l_dept_tab(l_dept_tab.count) := dept_t(r.deptno, r.dname);
  end loop;

  return l_dept_tab;
end;
/

create view depts_view as
select * from table (depts_fun);

select * from depts_view;

我并不是说它有用或做得好,只是说它是可能的!

当然,我可以(并且可能会在实际系统中)将该函数放在一个 PACKAGE 中,因此视图也可以基于一个包函数。

因此,您可以创建视图的(完整?)对象列表是:

表格 观看次数 同义词 物化视图 返回表类型的独立函数 封装返回表类型的函数

【讨论】:

我们可以说,可以在表达式 E = select something from T 中的任何可以代替 T 的东西上创建视图,其中 E 有效?【参考方案2】:

可以通过table 或另一个view 创建viewSynonyms 被包括在内,因为它们只是 table 的不同名称。 (viewdata 的视图)

您无法通过代码 (procedure,function,trigger,package) 或 sequence 创建视图。

作为特例是PIPELINED functions,正如格伦所说,它产生一组数据,语法是:

select something from TABLE(pipelined_function())

但这不是一个视图:)

【讨论】:

我猜一些 proc/function 结果可以作为表格查询。流水线函数或类似这样的示例:CREATE FUNCTION junk RETURN NUMBER IS BEGIN RETURN 2;结尾; SELECT junk() from dual 在您的示例中,选择的对象是dual,它是一个表格。流水线函数是另一回事,不是视图。语法为select something from TABLE(pipe_function()) 我只是有点犹豫说我们不能创建代码视图。我会将流水线表示例视为代码视图。这就是我想要达到的目的。我认为只要您的返回是嵌套表,也有非流水线示例。 我已添加以回答流水线功能。谢谢。 ..."但这不是一个视图 :)" create view v as select something from TABLE(pipelined_function()) - 现在是 ;-)

以上是关于我们可以创建一个关于过程、函数、触发器、包的视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

视图和触发器的上次运行日期

information_schema系列五(表,触发器,视图,存储过程和函数)

information_schema系列五(表,触发器,视图,存储过程和函数)

视图触发器事务存储过程函数

Mysql学习---视图/触发器/存储过程/函数/索引 180101

Mysql:视图触发器事务存储过程函数