2016-03-02 61 views
0

我是ORACLE編程中的新手,我試圖將表列值與傳入的數組進行比較,並且我在此過程中遇到了相當令人沮喪的時間。Oracle - PLS-00642:SQL語句中不允許使用本地集合類型

這是來自包頭的類型聲明。

TYPE T_STRING_ARRAY IS TABLE OF VARCHAR2(5); 

這裏是使用它的函數。

create or replace PACKAGE BODY TEST_PACK IS 

    FUNCTION TEST_LOG_FN 
    (
     PI_START_DATE IN VARCHAR2, 
     PI_END_DATE IN VARCHAR2, 
     PI_LOG_TYPE IN T_STRING_ARRAY 
) 
    RETURN T_REF_CURSOR 
    AS 
    PO_RESULT T_REF_CURSOR; 

    BEGIN 


    OPEN PO_RESULT FOR 
    SELECT 
     EL.ENTRY_BASE_LOG_ID, 
      EL.APP_NAME, 
      EL.APP_MODULE, 
      EL.CREATION_DATE, 
      EL.APP_STATUS, 
      EL.LOG_TYPE 
    FROM 
      LG_ENTRY_BASE_LOG EL 
    WHERE  
      CREATION_DATE > PI_START_DATE AND 
      CREATION_DATE < PI_END_DATE AND    
     (EL.LOG_TYPE IN PI_LOG_TYPE OR PI_LOG_TYPE = NULL); 

    RETURN 
     PO_RESULT; 

EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      RETURN NULL; 
     END TEST_LOG_FN; 
END; 

我得到的錯誤是PLS-00642:SQL語句中不允許使用本地集合類型。我已在線閱讀

「爲避免PLS-00642,需要在模式級定義集合;因此,您需要將varray表定義爲實際表,使用Oracle DDL和CREATE TYPE語法「。

http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm

我不知道怎麼做,也沒有我在網上找到,我可以用任何引用。有人可以幫助我嗎?如果有人知道更簡單的方法來查看數組中是否存在字符串,那麼這也是一個完全可以接受的答案。

回答

1

您可以使用Oracle 12C或更高版本中軟件包規範中定義的類型。

這條線:

(EL.LOG_TYPE IN PI_LOG_TYPE OR PI_LOG_TYPE = NULL) 

需要是:

(EL.LOG_TYPE IN (select column_value from table(PI_LOG_TYPE)) 
OR (select count(*) from table(PI_LOG_TYPE)) = 0) 

此前12C則需要使用CREATE TYPE的數據庫中定義的類型。選擇的語法是相同的。

+0

謝謝你的快速回復。我現在得到新的錯誤: PL/SQL:ORA-22905:無法訪問非嵌套表項中的行。從「table」一詞開始 – jmick2010

+0

您使用的是哪個Oracle版本? –

+0

版本是12C – jmick2010

0

而不是使用IN可以使用操作者MEMBER OF專門設計用於與集合:

(PI_LOG_TYPE = NULL OR EL.LOG_TYPE MEMBER OF PI_LOG_TYPE); 

正如@TonyAndrews注意如果正在使用Oracle 12c的話,可以用在PL在包中定義的集合/ SQL,但在早期版本中,您需要使用CREATE TYPE語句在SQL中定義它們。