2009-05-22 9 views
6

यहां संग्रहीत प्रक्रिया है। इस proc में "p_subjectid" फ्रंट एंड से पारित संख्याओं की एक सरणी है।ओरेकल त्रुटि ORA-22905: गैर-नेस्टेड टेबल आइटम से पंक्तियों तक नहीं पहुंच सकता

PROCEDURE getsubjects(p_subjectid subjectid_tab,p_subjects out refCursor) 
     as 

     BEGIN 

      open p_subjects for select * from empsubject where subject_id in 
      (select column_value from table(p_subjectid)); 
      --select * from table(cast(p_subjectid as packg.subjectid_tab)) 
     END getsubjects; 

यह वह त्रुटि है जो मुझे मिल रही है। ORA-00902: invalid datatype:

Oracle error ORA-22905: cannot access rows from a non-nested table item OR 

के रूप में मैं अलग पोस्ट में देखा है, मैं कास्टिंग "डाली (packg.subjectid_tab रूप p_subjectid)" के अंदर तालिका समारोह टिप्पणी में दिए गए below.But मैं एक और त्रुटि हो रही है के रूप में की कोशिश की।

और यह "subjectid_tab" की परिभाषा है।

type subjectid_tab is table of number index by binary_integer; 

क्या कोई मुझे बता सकता है कि त्रुटि क्या है। क्या मेरी प्रक्रिया में कुछ भी गलत है।

उत्तर

10

आप "डेटाबेस स्तर" के रूप में ammoQ सुझाव पर प्रकार की घोषणा करने के लिए है। यदि आप पीएल/एसक्यूएल ब्लॉक में टाइप की घोषणा करते हैं, तो यह एसक्यूएल "इंजन" के लिए उपलब्ध नहीं होगा।

+0

यह ओरेकल 11 जी में काम नहीं करता है, अगर कोई और संघर्ष कर रहा है .. पीएलएस -00355: पीएल/एसक्यूएल तालिका का उपयोग इस संदर्भ में परिभाषित नहीं है। हालांकि ओरेकल 12 सी में सबकुछ अच्छा दिखता है। 11 जी में चारों ओर एक काम के रूप में, यदि आप केवल सहयोगी सरणी (जैसे नोडजेस) से जुड़ सकते हैं, तो मैं अपने सहयोगी सरणी को नेस्टेड टेबल (पहले इंडेक्स द्वारा प्रत्यय) में लूप कर रहा हूं; जो प्रदर्शन को मारता है, लेकिन आप क्या कर सकते हैं? अगर कोई बेहतर तरीके से जानता है, तो पहुंचने में संकोच न करें। –

4

मुझे लगता है कि आप संख्याओं की तालिका पर तालिका() का उपयोग नहीं कर सकते हैं; यह वस्तुओं की एक मेज होना है।

+0

फिर संख्याओं की तालिका के साथ 'IN' खंड का उपयोग कैसे करें –

+2

इसे आजमाएं: "बाईन_इनटेगर द्वारा NUMBER INDEX की तालिका के रूप में टाइप करें टाइप करें" पीएल/एसक्यूएल के भीतर प्रकार घोषित करने के बजाय । –

+0

आपके सुझाव के लिए धन्यवाद।लेकिन मैंने टाइप के रूप में मेरे पैकेज विनिर्देश में उस प्रकार को घोषित कर दिया है subjectid_tab binary_integer द्वारा संख्या अनुक्रमणिका की तालिका है; –

1

आप pipelined क्वेरी इतना के परिणामों कास्ट करने के लिए है: अपने pipelined समारोह varchar2 के rowtype देता है, तो उसके बाद बना सकते हैं या REPLACE प्रकार char_array_t VARRAY है (उदाहरण के लिए)

एक प्रकार को परिभाषित

(32) वर्कर 2 (255); तालिका से चुनें * कास्ट (एफएन (एक्स) user_type_t के रूप में));

अब काम करेगा।

1

मुझे कल यह समस्या थी।

 
DECLARE 
    TYPE number_table IS TABLE OF NUMBER; 
    result_ids number_table := number_table(); 
BEGIN 
    /* .. bunch of code that uses my type successfully */ 

    OPEN ? AS 
    SELECT * 
    FROM TABLE(CAST(result_ids AS number_table)); /* BOOM! */ 
END; 

यह जावा रूटीन से पहले बताए गए दोनों तरीकों से विफल रहता है। मैंने पाया कि यह इस तथ्य के कारण था कि टाइप नंबर_टेबल को निर्यात करने योग्य तरीके से परिभाषित नहीं किया गया है, जिसे डेटाबेस से भेज दिया जा सकता है। प्रकार नियमित रूप से आंतरिक रूप से महान काम करता है। लेकिन जैसे ही आप एक वापसी योग्य रिकॉर्डसेट निष्पादित करने का प्रयास करते हैं जो इसे किसी भी तरह से संदर्भित करता है (IN Clauses सहित?!?) आपको एक डेटाटाइप परिभाषित नहीं किया जाता है।

तो समाधान वास्तव में टाइप है myschema.number_table संख्या का टैबलेट है; फिर अपने ब्लॉक से प्रकार की घोषणा ड्रॉप करें और स्कीमा स्तर की घोषणा का उपयोग करें। यह सुनिश्चित करने के लिए कि आप सही का उपयोग कर रहे हैं, प्रकार को संदर्भित करने के लिए स्कीमा क्वालीफायर का उपयोग करें।

CREATE TYPE subjectid_tab AS TABLE OF NUMBER INDEX BY binary_integer; 

बजाय PL/SQL भीतर प्रकार की घोषणा:

2

यह एक अच्छा समाधान है। यदि आप जिस प्रकार कास्ट करते हैं वह pl/sql ब्लॉक के DECLARE भाग में है, तो आप एक टेबल (कास्ट()) का उपयोग नहीं कर सकते हैं। आपको वास्तव में CREATE TYPE my_type [...] का उपयोग करने की आवश्यकता है। अन्यथा, यह "पंक्ति [...] अपवाद नहीं ला सकता है" फेंक देगा।

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