2016-01-22 71 views
-1

我要實現的是這樣的:凡在列<函數返回一個集合>在Oracle

例子:

Customers表中的列CUSTOMER_NO,姓名,年齡。

some_package包在其規範中定義的以下幾種類型:

type cust_type is record (custs Customers.customer_no); 
type rec_type is table of cust_type index by binary_integer; 
function some_function return rec_type; 

我試圖創建一個視圖中是這樣的:

select .... 
from customers c, tablex, tabley 
where c.customer_no in some_function() and 
... <<other clauses>> 
  • 我不能避免使用some_function( ),因爲邏輯使用動態SQL語句。

  • 我得到無效的數據類型錯誤,當我嘗試編譯視圖

是否有可能在Oracle SQL實現這一目標?我不想使用另一個函數並循環來執行此操作。

謝謝。

+2

您的問題沒有明確。與 – Moudiz

+0

曾用一個例子更新了一些簡單的查詢或例子進一步解釋。好心檢查。 –

+0

在SQL中,函數返回類型是有限的。 –

回答

0

不,type rec_type在包中聲明,可以在PL/SQL塊中使用,但不能在SQL語句中使用。

如果你想使用SQL語句的類型,那麼你將需要使用CREATE TYPE聲明這樣的聲明是:

CREATE TYPE customers_tab IS TABLE OF NUMBER; 

,或者您可以使用現有的類型像SYS.ODCINUMBERLIST

然後更改包:

CREATE OR REPLACE PACKAGE some_package 
AS 
    FUNCTION some_function RETURN SYS.ODCINUMBERLIST; 
END; 
/

CREATE OR REPLACE PACKAGE BODY some_package 
AS 
    FUNCTION some_function RETURN SYS.ODCINUMBERLIST 
    AS 
    t_customers SYS.ODCINUMBERLIST; 
    BEGIN 
    SELECT customer_no 
    BULK COLLECT INTO t_customers 
    FROM customers 
    WHERE MOD(customer_no, 3) = 0; -- or whatever your query is. 

    RETURN t_customers; 
    END; 
END; 
/

然後,你可以這樣做:

SELECT * 
FROM Customers c 
     INNER JOIN 
     TABLE(some_package.some_function()) t 
     ON (c.customer_no = t.COLUMN_VALUE);