2012-09-09 72 views
3

我已經在這裏看過很多解決方案來嘗試解決這個問題,他們已經變得相當遠了,但是現在我處於一些錯誤的雜草中,我似乎無法過去。從Oracle函數返回一個表

我在Oracle 11g上。我需要一個函數來返回記錄集(表)。下面是我使用的代碼:我從這次收到

CREATE TYPE T_TABLE IS OBJECT 
(
    Field1 int 
    , Field2 int 
); 

CREATE TYPE T_TABLE_COLL IS TABLE OF T_TABLE; 

CREATE OR REPLACE FUNCTION FN_MyFunction 
RETURN T_TABLE_COLL 
IS 
BEGIN 
    FOR I IN (SELECT Field1, Field2 FROM Table1) LOOP 
    IF I.Field1 = 1 THEN 
     BEGIN   
      INSERT INTO T_TABLE  
      SELECT Field1, Field2 
      FROM Table2 
      WHERE Field2 = I.Field2; 
     END; 
    ELSIF I.Field1 = 2 THEN 
     BEGIN   
      INSERT INTO T_TABLE  
      SELECT Field1, Field2 
      FROM Table2 
      WHERE Field2 = I.Field2; 
     END; 
    END IF; 
    END LOOP; 
    RETURN T_SMRYACCT_TABLE_COLL; 
END; 

的錯誤是:

  1. 聲明忽略的功能FN_MyFunction線和PL/SQL:ORA-04044:過程,函數,包裝或類型在這裏不允許在每一行INSERT INTO T_TABLE_COLL線

  2. PLS-00330:在返回線路的無效使用類型名稱或子類型名稱的

我在做什麼錯誤的表類型?

+0

如果你正在做的插入/更新或刪除使用存儲過程,而不是更多的信息功能一個函數。 – user75ponic

+0

我需要將結果連接到其他表,我不相信我可以在連接子句中使用SP。 – Matt

回答

5

T_TABLE_COLL是一個集合。您不能在集合上使用插入

CREATE OR REPLACE FUNCTION FN_MyFunction 
RETURN T_TABLE_COLL 
IS 
    l_res_coll T_TABLE_COLL; 
    l_index number; 
BEGIN 
    l_res_coll := T_TABLE_COLL(); 
    FOR I IN (SELECT col1, col2 FROM Table1) 
    LOOP 
    IF I.col1 = 1 THEN 
     l_res_coll.extend; 
     l_index := l_res_coll.count; 
     l_res_coll(l_index):= T_TABLE(i.col1, i.col2); 
    END IF; 
    END LOOP; 
    return l_res_coll; 
END; 

在行動

select * 
    from table(FN_MyFunction()) 

要得到什麼藏品,以及如何使用它們閱讀this

+0

榮譽回答!有一點你已經刪除了「elsif」,它什麼都不做。我認爲這是OP部分的編碼錯誤,而不是其他任何內容...... – Ben

+0

感謝您的迴應。我錯過了這是一個集合。然而,一個跟進問題,你有沒有看到從函數返回表的更直接的方法? Im實際上將使用一個不容易轉換的表值函數的TSQL代碼轉換爲PLSQL。 – Matt

+0

糾正了ELSIF是相關的,這是一個對話錯誤。實際的SQL有大約6個ELSIF,沒想到沒有必要發佈它們。 – Matt