2016-04-24 69 views
0

在SQL Server中,我只能使用'RETURNS TABLE',它會完成這項工作。但我怎麼也找不到做同樣用Oracle SQLOracle SQL創建函數或返回表的過程

我有一個需要放在一個函數或過程下面的SELECT語句:

SELECT a.CodAcord, a.Descr 
FROM FreqSoce f 
LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
WHERE f.codSoce = codSoce; 

codSoce在參數整數,我需要返回a.CodAcorda.Descr作爲我的函數/過程的結果。
有沒有簡單的方法來做到這一點?而不必應付臨時變量和/或高級內容...

編輯: aditional的信息:
- 我需要返回a.CodAcorda.Descr,但是當我做了一些研究,懂得回報超過一個使用SQL函數或過程的變量,我能找到的僅僅是返回一個TABLE。如果有一種方法可以從函數或過程中返回多個項目,請讓我知道。
- 嚴格要求使用函數或程序。
- 我正在使用SQL Developer。

+0

你需要返回a.CodAcord和a.Descr對於給定codScoce,或者你需要返回表?我沒有看到連接。另外:你需要一個這樣的程序,還是使用綁定變量足夠?你用什麼來與Oracle接口:SQL * Plus?蟾蜍? SQL Developer?每種方法都允許您「輸入」一個綁定變量並基於此生成輸出。請澄清,我們可以從那裏採取。 – mathguy

+0

提供的附加信息,感謝您的幫助。 –

回答

0

看看下面的代碼模板:

CREATE OR REPLACE PACKAGE tacord AS 
    TYPE ttabAcord IS TABLE OF ACord%ROWTYPE; 
END tacord; 
/
show err 

CREATE OR REPLACE PACKAGE BODY tacord AS 
BEGIN 
    NULL; 
END tacord; 
/
show err 

CREATE OR REPLACE FUNCTION demo RETURN tacord.ttabAcord AS 
    to_return tacord.ttabAcord; 
BEGIN 
       SELECT a.* 
    BULK COLLECT INTO to_return 
       FROM FreqSoce f 
      LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
       WHERE f.codSoce = codSoce 
        ; 
    RETURN to_return; 
END demo; 
/
show err 

要點:

  • %ROWTYPE代表一個數據庫表中的記錄的數據類型
  • BULK COLLECT INTO插入一個完整的結果集到一個PLSQL數據結構
  • 對錶內容的迭代由plsql收集方法提供,即.FIRST.LAST.NEXT
+0

更正了代碼模板。代碼編譯爲 – collapsar

+0

,但使用SQL Developer執行時不會返回任何內容,是否有執行此操作的特殊方法? –

+0

對不起,我通常不使用sql dev。 – collapsar

0

通過使用流水線表函數,可以實現一個表作爲函數的返回值。請看下面的例子:

-- Create synthetic case 
CREATE TABLE Acord AS 
SELECT rownum CodAcord, 'Description ' || rownum Descr 
    FROM dual CONNECT BY LEVEL <= 5; 

CREATE TABLE FreqSoce AS 
SELECT rownum CodSoce, rownum CodAcord 
    FROM dual CONNECT BY LEVEL <= 10; 

-- Test dataset 
SELECT a.CodAcord, a.Descr 
    FROM FreqSoce f 
    LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
WHERE f.CodSoce = 10; 

-- Here begins actual code 
-- Create an object type to hold each table row 
CREATE OR REPLACE TYPE typ_acord AS OBJECT(
    CodAcord NUMBER, 
    Descr VARCHAR2(40) 
); 
/

-- Create a collection type to hold all result set rows 
CREATE OR REPLACE TYPE tab_acord AS TABLE OF typ_acord; 
/

-- Our function that returns a table 
CREATE OR REPLACE FUNCTION getAcord(pCodSoce IN NUMBER) 
RETURN tab_acord PIPELINED 
AS 
BEGIN 
    FOR x IN (SELECT a.CodAcord, a.Descr 
       FROM FreqSoce f 
       LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
      WHERE f.CodSoce = pCodSoce) 
    LOOP 
    PIPE ROW (typ_acord(x.CodAcord, x.Descr)); 
    END LOOP; 
END; 
/

-- Testing the function (please note the TABLE operator) 
SELECT * FROM TABLE(getAcord(5)); 
相關問題