2012-11-09 6 views
7

मेरे पास दो टेबल हैं।
एक answer_step_dtl
का पालन के रूप में
किसी अन्य तालिका से चुनिंदा कथन में पंक्ति में एकाधिक टैग को बदलें

Ans_code      Ans_Desc 
------------------------------------------- 
50000000000000005770  Enter <B><APN></B> and press Ok.  
40000000000000000164  Enter <B><ACCOUNTNAME></B> in connection name. 
40000000000000000165  Enter <B><ACCOUNTNAME></B> in <APN>. 

और इतने पर एक और tag_mst जाता है।

और मेरे tag_mst इस

TAG_CODE     TAG_NAME   TAG_VALUE 
------------------------------------------------------- 
100       <APN>   EXAMPLE.COM 
101       <ACCOUNTNAME> EXAMPLE 

की तरह मान हैं अब मेरी आवश्यकता इस मैं टैग मस्तूल के प्रतिस्थापित मान के साथ जवाब रूप जवाब तालिका का चयन करना चाहते है। एक ans_desc में एक से अधिक टैग हो सकते हैं।

मैं answer_dtl का परिणाम के माध्यम से दृष्टिकोण

  1. लूप में सोच रहा था रिकॉर्ड में एकाधिक टैग के माध्यम से

  2. पाश व्यक्तिगत रिकॉर्ड से टैग लाने और फिर टैग को बदलने

  3. एक अस्थायी तालिका में स्टोर करें और फिर कर्सर को नई tem तालिका के लिए खोलें।

क्या यह दृष्टिकोण है। या ऐसा करने का कोई आसान तरीका है।

+0

क्या यह संभव है कि आपके पास एक ही 'ans_desc' में दो टैग नाम हों? – Ben

+0

हाँ यह संभव है अन्यथा @joe समाधान सही है। –

+0

@ बेन मैंने अपना प्रश्न अपडेट किया है कृपया इसे देखें। –

उत्तर

3

संपादित करें: बोनस क्वेरी @Rob van Wijk से उपयोग कर (पुनरावर्ती) CTE, inspired by a note, 11g की जरूरत है (आर 2?):

SQL> WITH data AS (
    2  SELECT ans_code, Ans_Desc, tag_name, tag_value, 
    3   row_number() OVER (partition BY ans_code ORDER BY t.rowid) no, 
    4   row_number() OVER 
    5    (partition BY ans_code ORDER BY t.rowid DESC) is_last 
    6  FROM answer_step_dtl a 
    7  JOIN tag_mst t ON a.ans_desc LIKE '%' || t.tag_name || '%' 
    8 ), n(ans_code, no, is_last, replaced) AS (
    9  SELECT ans_code, no n, is_last, 
10   replace (ans_desc, tag_name, tag_value) replaced 
11  FROM data 
12  WHERE no = 1 
13  UNION ALL 
14  SELECT d.ans_code, d.no, d.is_last, 
15   replace (n.replaced, d.tag_name, d.tag_value) replaced 
16  FROM data d 
17  JOIN n ON d.ans_code = n.ans_code 
18  AND d.no = n.no + 1 
19 ) 
20 SELECT * 
21 FROM n 
22 WHERE is_last=1; 

ANS_CODE    NO IS_LAST REPLACED 
-------------------- -- ------- --------------------------------------- 
40000000000000000164 1  1 Enter <B>EXAMPLE</B> in connection 
50000000000000005770 1  1 Enter <B>EXAMPLE.COM</B> and press Ok. 
40000000000000000165 2  1 Enter <B>EXAMPLE</B> in EXAMPLE.COM. 

प्रारंभिक जवाब:

आप एक PL/SQL समारोह का उपयोग कर सकते हैं। निम्नलिखित टैग किए जाने के बावजूद निम्नलिखित काम करेंगे:

CREATE OR REPLACE FUNCTION replacetags(p_desc VARCHAR2) 
    RETURN VARCHAR2 IS 
    l_result LONG := p_desc; 
    l_tag_pos INTEGER := 1; 
    l_tag  tag_mst.tag_name%TYPE; 
BEGIN 
    LOOP 
     l_tag  := regexp_substr(l_result, '<[^<]+>', l_tag_pos); 
     l_tag_pos := regexp_instr(l_result, '<[^<]+>', l_tag_pos) + 1; 
     EXIT WHEN l_tag IS NULL; 
     BEGIN 
     SELECT replace(l_result, l_tag, tag_value) 
      INTO l_result 
      FROM tag_mst 
      WHERE tag_name = l_tag; 
     EXCEPTION 
     WHEN no_data_found THEN 
      NULL; -- tag doesn't exist in tag_mst 
     END; 
    END LOOP; 
    RETURN l_result; 
END; 

SQL> SELECT ans_code, replacetags(ans_desc) 
    2 FROM answer_step_dtl; 

ANS_CODE    REPLACETAGS(ANS_DESC) 
--------------------- ---------------------------------------- 
50000000000000005770 Enter <B>EXAMPLE.COM</B> and press Ok. 
40000000000000000164 Enter <B>EXAMPLE</B> in connection 
40000000000000000165 Enter <B>EXAMPLE</B> in EXAMPLE.COM. 
+0

thaks @Vincent मैं इसे लागू करने जा रहा हूं और इसे देखता हूं –

+0

धन्यवाद @ विन्सेंट यह पूरी तरह से काम कर रहा है। लेकिन अगर वे answer_step_dtl में 60 से 70 कदम हैं और प्रत्येक चरण में कुछ टैग है तो वे कुछ ओवरहेड (खुले कर्सर मुद्दे) होंगे। –

+0

यह केवल एक बार 'answer_step_dtl' से पंक्तियां पढ़ेगा, और प्रत्येक टैग के लिए आपको एक इंडेक्स अद्वितीय स्कैन मिलेगा, इसलिए यह ठीक होना चाहिए। कोई खुला कर्सर समस्या नहीं होगी क्योंकि फ़ंक्शन स्पष्ट कर्सर का उपयोग नहीं करता है :) यदि आप 11 जीआर 2 पर हैं तो आप अन्य क्वेरी को आजमा सकते हैं और बता सकते हैं कि आपके डेटासेट पर सबसे तेज़ कौन सा है। –

1

इस प्रयास करें:

select d."Ans_code",replace("Ans_Desc","TAG_NAME","TAG_VALUE") 
from answer_step_dtl d, tag_mst m 
where "Ans_Desc" like '%'|| "TAG_NAME" || '%' 


SQL fiddle demo

+0

के बीच एक से अधिक संबंध हैं यदि यह पंक्ति में दो टैग हैं तो यह काम करेगा? –

+0

मैंने संपादन करके कोशिश की है लेकिन एकाधिक टैग के लिए यह काम नहीं कर रहा है। –

+0

@ कृशेखर: फिर –

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

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