2010-01-13 34 views
11

以前我見過這方面的討論,比如here。但是我想知道如果在某個地方,可能是10g或11g(我們使用11g),ORACLE已經引入了對「參數化視圖」的更好的支持,而不需要用各種用戶定義的類型和/或遊標定義或sys_context變量全部。ORACLE 11g中的表值函數? (參數化視圖)

我希望也許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

我希望能得到同樣的結果... – craig 2016-03-01 18:23:20

回答

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

不錯的答案(在my_tab_type中創建「stray」。)。值得一提的是,這在10g中起作用。 – 2010-01-14 16:16:37

+0

不符合'不需要用各種用戶定義的類型'亂丟數據庫'的要求。 – craig 2016-03-01 18:22:24

-1

有在SQL Server中有兩種類型的表值函數:

  1. 聯表值函數:內嵌表值函數,有沒有功能體;該表是單個SELECT聲明的結果集。據我所知,這種類型可以命名爲 '參數化視圖',它在ORACLE中沒有等價物。

  2. 多語句表值函數:對於多語句表值函數,函數體,在BEGIN...END塊定義,包含了一系列構建和行插入將返回的表的Transact-SQL語句。

將上述樣品(代理人Gary邁爾斯)創建第二類型的表函數和它不是一個「參數化的視圖」。

+4

的問題是關於ORACLE的 – 2013-11-29 07:52:50

2

可以在Oracle中定義一種「參數化」視圖。 的步驟是:

  1. 定義一個包含作爲公共成員但實際上所需要的參數的包(沒有必要的功能或該包中的過程),
  2. 定義一個是基於一個視圖包成員。

要使用這個機制中的一個用戶應:

  1. 打開會話,
  2. 分配所需的值,以該包裝件,
  3. SELECT數據從視圖,
  4. 做其它東西或關閉會話。

REMARK:有必要爲用戶做只有一個會話作爲封裝部件範圍內的所有三個步驟是完全會話。