2010-01-11 43 views
8

簡單地嘗試爲我指定的id返回一個遊標。在IN子句中使用Oracle表類型 - 編譯失敗

 
CREATE OR REPLACE PACKAGE some_package AS 

    TYPE t_cursor IS REF CURSOR; 
    TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER; 

    PROCEDURE someentity_select(
    p_ids  IN t_id_table, 
    p_results OUT t_cursor); 

END; 

CREATE OR REPLACE PACKAGE BODY some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT t_cursor) 
    IS 
    BEGIN 

    OPEN p_results FOR 
     SELECT * 
     FROM someschema.someentity 
     WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here 

    END; 

END; 

注:someschema.someentity.id是NVARCHAR2(38)

PL/SQL:ORA-00382:表達式是錯誤的類型的
PL/SQL:ORA-22905:不能訪問的行來自非嵌套表項目

我在哪裏出錯了?

回答

10

只能從在數據庫通過一個CREATE TYPE語句定義的集合類型選擇,關聯數組:

CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38); 

CREATE OR REPLACE PACKAGE some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT SYS_REFCURSOR); 

END; 

CREATE OR REPLACE PACKAGE BODY some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT SYS_REFCURSOR) 
    IS 
    BEGIN 

    OPEN p_results FOR 
     SELECT * 
     FROM someschema.someentity 
     WHERE id IN (SELECT column_value FROM TABLE(p_ids)); 

    END; 

END; 
+0

謝謝..但現在它顯示ORA-12714:無效的國家字符集在該行上指定..雖然更接近。 – 2010-01-11 23:18:58

+1

您可能想發佈另一個關於該問題的問題,因爲它是一個完全不同的問題,我不知道國家字符集問題。 – 2010-01-12 15:22:27

3

這是一個索引表,這是一個PL/SQL類型。

您只能在Oracle的SQL引擎中使用SQL類型。或者PL/SQL類型,Oracle可以破解它看起來像SQL類型。

您可以擁有一個簡單的類似數組的收集並將其用作結果。 (由沒有索引)

type TGuidList is table of NVarchar(38); 

但最好的兼容性和穩定性,你會得到通過聲明它作爲一個全球性的SQL類型和使用你的包內:

創建類型TGuidList是爲nvarchar表(38) ;

編輯:你不需要一個GUID的NVarChar,你會嗎?好的VarChar應該可以做到這一點。

+0

我必須使用NVarchar2 - 它是我客戶的古老數據庫標準的一部分(這也是我使用SP的原因)。 – 2010-01-12 02:49:06