【问题标题】:Table-Valued Functions in ORACLE 11g ? ( parameterized views )ORACLE 11g 中的表值函数? (参数化视图)
【发布时间】:2011-01-04 18:47:13
【问题描述】:

我过去曾看到过有关此问题的讨论,例如 here。但我想知道是否在某个地方,可能是 10g 或 11g(我们正在使用 11g),ORACLE 是否引入了对“参数化视图”的任何更好的支持,而无需在数据库中乱扔各种用户定义的类型和/或游标定义或 sys_context 变量。

我希望 ORACLE 可能会增加对“正常工作”的支持,如以下 T-SQL 示例所示:

CREATE FUNCTION [dbo].[getSomeData] (@PRODID ROWID)  
RETURNS TABLE AS  
    RETURN SELECT PRODID, A, B, C, D, E  
    FROM MY_TABLE  
    WHERE PRODID = @PRODID

然后就这样选择它:

SELECT * FROM dbo.getSomeData(23)

【问题讨论】:

  • 我也希望得到同样的结果......

标签: oracle views oracle11g parameterized user-defined-functions


【解决方案1】:

不需要 SYS_CONTEXT 或游标定义。 您确实需要一个类型,以便在解析 SQL 时,它可以确定要返回哪些列。 也就是说,您可以轻松编写一个脚本,该脚本将根据 user_tab_columns 中的数据为一个或多个表生成类型和集合类型定义。

最接近的是

create table my_table
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1));

create type my_tab_type is object
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1))
.
/

create type my_tab_type_coll is table of my_tab_type;
/

create or replace function get_some_data (p_val in number) 
return my_tab_type_coll pipelined is
begin
  FOR i in (select * from my_table where prodid=p_val) loop
    pipe row(my_tab_type(i.prodid,i.a,i.b,i.c,i.d,i.e));
  end loop;
  return;
end;
/

SELECT * FROM table(get_Some_Data(3));

【讨论】:

  • 不错的答案(my_tab_type 创建中的杂散“。”)。值得一提的是,这适用于 10g。
  • 不满足“不需要在数据库中乱扔各种用户定义类型”的要求。
【解决方案2】:

SQL SERVER 中有两种类型的表值函数:

  1. 内联表值函数:对于内联表值函数,没有函数体;该表是单个SELECT 语句的结果集。这种类型可以命名为 '参数化视图',据我所知,它在 ORACLE 中没有等价物。

  2. 多语句表值函数:对于多语句表值函数,在 BEGIN...END 块中定义的函数主体包含一系列 Transact-SQL 语句,这些语句在表中构建和插入行,这些语句将被退回。

上面的示例(作者 Gary Myers)创建了第二种类型的表函数,它不是“参数化视图”。

【讨论】:

  • 问题是关于ORACLE的
【解决方案3】:

可以在 Oracle 中定义一种“参数化”视图。 步骤是:

  1. 定义一个包含公共成员的包,这些成员实际上是所需的参数(该包中不需要函数或过程),
  2. 定义基于该包成员的视图。

要使用这种机制,用户应该:

  1. 打开一个会话,
  2. 为该包成员分配所需的值,
  3. SELECT 视图中的数据,
  4. 做其他事情或关闭会话。

备注:用户必须在一个会话中完成所有三个步骤,因为包成员范围恰好是一个会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2015-09-26
    • 2013-05-04
    • 2015-08-04
    • 2014-07-05
    • 2014-07-15
    • 2014-05-09
    相关资源
    最近更新 更多