2010-01-11 10 views
8

विफल रहता है बस मैं निर्दिष्ट आईडी के लिए एक कर्सर प्राप्त करने का प्रयास कर रहा हूं।इन-क्लॉज में ओरेकल टेबल प्रकार का उपयोग करना - संकलन

 
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-00,382: ORA-22,905: पंक्तियों तक नहीं पहुँच सकता अभिव्यक्ति गलत प्रकार का
PL/SQL है गैर-नेस्टेड टेबल आइटम से

मैं गलत कहां जा रहा हूं?

उत्तर

10

आप केवल एक संग्रह प्रकार है कि एक बनाएं प्रकार बयान के माध्यम से डेटाबेस में परिभाषित किया गया है से चुन सकते हैं, नहीं एक साहचर्य सरणी:

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

धन्यवाद .. लेकिन अब यह ओआरए -12714 दिखाता है: उस रेखा पर निर्दिष्ट अवैध राष्ट्रीय चरित्र सेट .. हालांकि बहुत करीब है। –

+1

आप इसके बारे में एक और सवाल पोस्ट करना चाहेंगे, क्योंकि यह एक पूरी तरह से अलग समस्या है और मुझे राष्ट्रीय चरित्र सेट मुद्दों के बारे में कोई जानकारी नहीं है। –

3

यह एक सूचकांक-दर तालिका है, जो एक पी एल है/एसक्यूएल प्रकार।

आप केवल ओरेकल के एसक्यूएल इंजन में एसक्यूएल प्रकार का उपयोग कर सकते हैं। या पीएल/एसक्यूएल प्रकार, कि ओरेकल एसक्यूएल प्रकारों की तरह दिखने के लिए चारों ओर हैक कर सकते हैं।

आपके पास एक साधारण सरणी जैसी संग्रह हो सकती है और परिणामस्वरूप इसका उपयोग कर सकते हैं। (द्वारा कोई सूचकांक)

type TGuidList is table of NVarchar(38); 

लेकिन सबसे अच्छा संगतता और स्थिरता, आप एक वैश्विक एसक्यूएल प्रकार के रूप में यह घोषणा करके मिलता है और उपयोग करने वाले अपने पैकेज के अंदर:

प्रकार बनाने TGuidList NVARCHAR की मेज है (38) ;

संपादित करें: आपको GUID के लिए NVarChar की आवश्यकता नहीं होगी, है ना? एक अच्छा ओल 'वरहर को चाल ठीक करना चाहिए।

+0

मुझे NVarchar2 का उपयोग करना है - यह मेरे क्लाइंट के पुरातन डेटाबेस मानक का हिस्सा है (यही कारण है कि मैं एसपी का उपयोग भी कर रहा हूं)। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^