Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पीएल/एसक्यूएल कोड ब्लॉक को रिकर्सिव कैसे करें जो कई चुनिंदा वाक्यों के साथ काम करता है?

आपने अपने rec . का वर्णन नहीं किया है टाइप करें, इसलिए मैं एक उदाहरण दिखाऊंगा कि इसे और अधिक स्वतंत्र कैसे बनाया जाए:

declare
    type t_rec is record(
        param1 varchar2(30),
        param2 varchar2(30),
        param3 varchar2(30),
        param4 varchar2(30),
        param5 varchar2(30)
        );
    rec t_rec;
    v_tx_cuerpo varchar2(4000);
    
    function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
    as
        res varchar2(32767):=str;
    begin
        for i in 1..subst.count loop
            res:=replace(res, replace(template,'%d',i), subst(i));
        end loop;
        return res;
    end;
begin
    v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
    v_tx_cuerpo:=f_subst(
                    v_tx_cuerpo,
                    '${param%d}',
                    ora_name_list_t('str1','str2','str3','str4','str5')
                    );
    dbms_output.put_line(v_tx_cuerpo);
end;
/

जैसा कि आप देख सकते हैं कि मैंने function f_subst बनाया है इसमें 3 तर्क होते हैं:

  • str varchar2 - प्रतिस्थापन के लिए इनपुट स्ट्रिंग
  • template varchar2 - प्रतिस्थापन के लिए स्ट्रिंग मास्क, आपके उदाहरण में यह ${param%d} . है
  • subst ora_name_list_t - यह एक संग्रह TYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1) की तालिका के रूप में परिभाषित , ताकि आप प्रतिस्थापन के लिए किसी भी संख्या में स्ट्रिंग निर्दिष्ट कर सकें। इस उदाहरण में, मैंने str1 . डाला है करने के लिए str5

तो यह फ़ंक्शन इनपुट संग्रह तत्वों को पुनरावृत्त करता है और इस संग्रह के मूल्य के साथ इनपुट टेम्पलेट मास्क से मेल खाने वाले किसी भी सबस्ट्रिंग को बदल देता है।

परिणाम:

p1:str1;p2:str2;p3:str3;p4:str4;p5:str5;

और अंत में अपने मूल rec . का उपयोग करना :

declare
    type t_rec is record(
        param1 varchar2(30),
        param2 varchar2(30),
        param3 varchar2(30),
        param4 varchar2(30),
        param5 varchar2(30)
        );
    rec t_rec;
    v_tx_cuerpo varchar2(4000);
    
    function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
    as
        res varchar2(32767):=str;
    begin
        for i in 1..subst.count loop
            res:=replace(res, replace(template,'%d',i), subst(i));
        end loop;
        return res;
    end;
begin
    v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
    rec.param1:='str1';
    rec.param2:='str2';
    rec.param3:='str3';
    rec.param4:='str4';
    rec.param5:='str5';
    
    v_tx_cuerpo:=f_subst(
                    v_tx_cuerpo,
                    '${param%d}',
                    ora_name_list_t(
                        rec.param1,
                        rec.param2,
                        rec.param3,
                        rec.param4,
                        rec.param5
                        )
                    );
    dbms_output.put_line(v_tx_cuerpo);
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका में सभी पंक्तियों के बीच सूची में सभी मानों से मेल खाने के लिए Oracle क्वेरी

  2. ORA-00906:बायां कोष्ठक गुम है

  3. किसी अन्य कॉलम के मानों के साथ कॉलम अपडेट करें

  4. विंडोज़ पर Oracle डाटाबेस कैसे स्थापित करें

  5. zxJDBC उपयोग के साथ कॉल टू प्रोसेस में गलत संख्या या तर्क के प्रकार