2016-06-09 3 views
6

मान लीजिए मैं एक hierachical संरचना का प्रतिनिधित्व एक डेटाबेस तालिका, निम्नलिखित कॉलम के साथ है:मैं एबीएपी में पदानुक्रमित संरचना के सभी बाल नोड्स को कैसे प्राप्त करूं?

  • आईडी
  • predecessor_id
  • नाम

दी गई ID से शुरू, मैं सक्षम होना चाहिए सभी बच्चे नोड्स (न केवल प्रत्यक्ष बच्चों) को पुनः प्राप्त करने के लिए। चूंकि आम तालिका अभिव्यक्तियां (रिकवरी के साथ) एबीएपी में उपलब्ध नहीं हैं, इसलिए इसे हल करने का सबसे अच्छा तरीका क्या होगा?

एक संभावित समाधान मैंने सोचा है कि परिणाम सेट (लूप या कर्सर का उपयोग करके) के माध्यम से पुनरावृत्ति कर रहा है, और फिर से एक फ़ंक्शन को कॉल करें जो प्रत्यक्ष बाल नोड्स को पुनर्प्राप्त करता है। हालांकि, मुझे उम्मीद है कि एक और अधिक सुरुचिपूर्ण दृष्टिकोण है।

+0

मुझे बच्चों को दोबारा चुनने की तुलना में सभी वंशजों को खोजने का कोई और तरीका नहीं दिखता - ठीक वही आपने जो सोचा था। जहां यह एक प्रदर्शन समस्या थी, कुछ मामलों में हमने एक कॉलम 'मास्टर_आईडी' पेश किया है, जिसमें तत्व की शीर्ष स्तर आईडी है, और इसके लिए डेटाबेस पर द्वितीयक अनुक्रमणिका है, – rplantiko

+0

मुझे नहीं लगता कि यह बहुत व्यापक है, खासकर यह देखते हुए कि @ rplantiko की टिप्पणी लगभग एक पूर्ण जवाब है। –

उत्तर

4

सबसे पहले आपको यह जानने की जरूरत है कि एसएपी डेटाबेस नहीं है और ओपनएसक्यूएल हमेशा अंतर्निहित डेटाबेस की एसक्यूएल बोली में अनुवादित है। यदि अंतर्निहित डेटाबेस WITH या WITH RECURSIVE का समर्थन नहीं करता है और मैं निम्नलिखित article से जो कुछ देखता हूं, उससे प्रत्येक डेटाबेस ऐसा नहीं करता है, तो इसे ओपनएसक्यूएल में जोड़ना कोई समझ नहीं आता है क्योंकि कई मामलों में इसे मानचित्र करने के लिए कुछ भी नहीं होगा ।

तो पहला समाधान जैसा कि आपने प्रस्तावित किया था, एक अलग रिकर्सिव फ़ंक्शन/विधि/सबराउटिन लिखना होगा या यदि आप वास्तव में अंतर्निहित डेटाबेस कार्यक्षमता का उपयोग करना चाहते हैं तो आप ADBC इंटरफ़ेस का उपयोग कर सकते हैं। यदि आप JDBC से परिचित हैं तो अवधारणा आपके लिए नई नहीं होनी चाहिए। यदि आप उत्पादक उद्देश्यों के लिए ऐसा कर रहे हैं, तो आपको यह सुनिश्चित करना चाहिए कि भविष्य में डेटाबेस माइग्रेशन की कोई समस्या या कोई संभावना न हो।

ADBC के साथ समाधान जो एक अंतर्निहित ओरेकल डेटाबेस के साथ एक एसएपी सिस्टम पर मेरे लिए काम करता है।

REPORT Z_ADBC_TEST. 

CLASS lcl_test DEFINITION. 
    PUBLIC SECTION. 
     CLASS-METHODS: 
      main. 
ENDCLASS. 

CLASS lcl_test IMPLEMENTATION. 
    METHOD main. 
     DATA lo_sql_connection TYPE REF TO cl_sql_connection. 
     DATA lo_sql_statement TYPE REF TO cl_sql_statement. 
     DATA lo_sql_result_set TYPE REF TO cl_sql_result_set. 
     TYPES BEGIN OF lt_result_struct, 
      n TYPE i, 
      fact TYPE i, 
     END OF lt_result_struct. 
     DATA lt_result TYPE TABLE OF t_result_struct WITH DEFAULT KEY. 
     DATA lr_ref_to_data TYPE REF TO data. 
     FIELD-SYMBOLS <fs_result> LIKE LINE OF lt_result. 

     lo_sql_connection = cl_sql_connection=>get_connection(). 
     lo_sql_statement = lo_sql_connection->create_statement(). 
     GET REFERENCE OF lt_result INTO lr_ref_to_data. 
     lo_sql_result_set = lo_sql_statement->execute_query(
      `WITH temp(n, fact) ` && 
      `AS (SELECT 0,1 FROM dual UNION ALL ` && 
      `SELECT n+1,(n+1)*fact FROM temp ` && 
      `WHERE n < 9) ` && 
      `SELECT * FROM temp` 
     ). 
     lo_sql_result_set->set_param_table(lr_ref_to_data). 
     WHILE lo_sql_result_set->next_package() > 0. 
      LOOP AT lt_result ASSIGNING <fs_result>. 
       WRITE:/<fs_result>-n, <fs_result>-fact. 
      ENDLOOP. 
     ENDWHILE. 
    ENDMETHOD. 
ENDCLASS. 

END-OF-SELECTION. 
    lcl_test=>main(). 
+0

मैंने यह नहीं बताया कि "एसएपी एक डेटाबेस है"। इसके अलावा, मेरे पास पहले से ही रिकर्सिव दृष्टिकोण लागू करने का समाधान है। सवाल यह था कि अगर इसे अलग तरीके से हल किया जा सकता है। –

+0

@ ट्यूडरकोट्लोस बहुत जिज्ञासा से बाहर ... क्या आपकी एसएपी प्रणाली आरडीबीएमएस पर आधारित है? – Jagger

+0

@ जेगर एसएपी सिस्टम पर आरडीबीएमएस मैं वर्तमान में काम कर रहा हूं ओरेकल 11.2 है। –

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