我过去曾见过有关此问题的讨论,例如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)
答案 0 :(得分:17)
不需要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));
答案 1 :(得分:2)
可以在Oracle中定义一种“参数化”视图。 步骤是:
要使用此机制,一个用户应该:
SELECT
数据备注:用户必须只在一个会话中执行所有这三个步骤,因为包成员范围恰好是一个会话。
答案 2 :(得分:-1)
SQL SERVER中有两种类型的表值函数:
内联表值函数:对于内联表值函数,没有函数体;该表是单个SELECT
语句的结果集。此类型可以命名为
'参数化视图',它在ORACLE中没有我所知的等价物。
多语句表值函数:对于多语句表值函数,在BEGIN...END
块中定义的函数体包含一系列构建行并在表中插入行的Transact-SQL语句将被退回。
以上示例(由Gary Myers创建)创建第二种类型的表函数,它不是“参数化视图”。