我们可以创建一个关于过程、函数、触发器、包的视图吗?
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
创建view
。 Synonyms
被包括在内,因为它们只是 table
的不同名称。 (view
是 data 的视图)
您无法通过代码 (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系列五(表,触发器,视图,存储过程和函数)