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

cfprocparam का उपयोग करके Oracle में सरणी या सूची

Oracle 8.0 के बाद से PL/SQL ने सरणियों का समर्थन किया है। उन्हें पीएल/एसक्यूएल टेबल कहा जाता था जो हर किसी को भ्रमित करता था, इसलिए अब उन्हें संग्रह कहा जाता है। और जानें।

समस्या यह है कि उन्हें उपयोगकर्ता-परिभाषित प्रकार (यानी ऑब्जेक्ट्स) के रूप में कार्यान्वित किया जाता है। मेरा पढ़ना ColdFusion दस्तावेज़ सुझाव देता है कि cfprocparam केवल "आदिम" डेटाटाइप (संख्या, varchar2, आदि) का समर्थन करता है। इसलिए यूडीटी समर्थित नहीं हैं।

मुझे नहीं पता कि आपका इससे क्या मतलब है:

यदि आपका मतलब है कि आप अल्पविराम से अलग किए गए मानों की एक स्ट्रिंग पास करना चाहते हैं ....

"Fox in socks, Mr Knox, Sam-I-Am, The Lorax"

तो मेरे पास आपके लिए एक उपाय है। Oracle एक अंतर्निर्मित Tokenizer प्रदान नहीं करता है। लेकिन बहुत समय पहले जॉन स्पेंसर ने एक हैंड-रोल्ड समाधान प्रकाशित किया था जो OTN मंचों पर Oracle 9i में काम करता है। इसे यहां खोजें।

संपादित करें

हिम्मत न हारिये। जॉन द्वारा पोस्ट किए जाने के बाद से ओटीएन फ़ोरम को कई बार अपग्रेड किया गया है, और ऐसा लगता है कि फ़ॉर्मेटिंग ने रास्ते में कहीं न कहीं कोड को दूषित कर दिया है। कुछ संकलन त्रुटियां थीं जिनका वह उपयोग नहीं करता था।

मैंने जॉन के कोड को फिर से लिखा है, जिसमें एक नया फंक्शन भी शामिल है। मुख्य अंतर यह है कि नेस्टेड तालिका को PL/SQL प्रकार के बजाय SQL प्रकार के रूप में घोषित किया जाता है।

create or replace type tok_tbl as table of varchar2(225) 
/

create or replace package parser is

    function my_parse(
          p_str_to_search in varchar2
            , p_delimiter in varchar2 default ',')
          return tok_tbl;

    procedure my_parse(
          p_str_to_search in varchar2
          , p_delimiter in varchar2 default ','
          , p_parsed_table out tok_tbl);

end parser;
/

जैसा कि आप देख सकते हैं, फ़ंक्शन प्रक्रिया के लिए केवल एक आवरण है।

create or replace package body parser is

    procedure my_parse ( p_str_to_search in varchar2
                          , p_delimiter in varchar2 default ','
                          , p_parsed_table out tok_tbl)
    is
        l_token_count binary_integer := 0;
        l_token_tbl tok_tbl := tok_tbl();
        i pls_integer;
        l_start_pos integer := 1;
        l_end_pos integer :=1;   
    begin

        while l_end_pos != 0
        loop
            l_end_pos := instr(p_str_to_search,p_delimiter,l_start_pos);

            if l_end_pos  != 0 then
                l_token_count := l_token_count + 1;
                l_token_tbl.extend();
                l_token_tbl(l_token_count ) :=
                    substr(p_str_to_search,l_start_pos,l_end_pos - l_start_pos);
                l_start_pos := l_end_pos + 1;
            end if;
        end loop;

        l_token_tbl.extend();
        if l_token_count = 0 then /* we haven't parsed anything so */
            l_token_count := 1;
            l_token_tbl(l_token_count) := p_str_to_search;
        else /* we need to get the last token */
            l_token_count := l_token_count + 1;
            l_token_tbl(l_token_count) := substr(p_str_to_search,l_start_pos);
        end if;
        p_parsed_table := l_token_tbl;
    end my_parse;

    function my_parse ( p_str_to_search in varchar2
                            , p_delimiter in varchar2 default ',')
                          return tok_tbl
    is
        rv tok_tbl;
    begin
        my_parse(p_str_to_search, p_delimiter, rv);
        return rv;
    end my_parse;

end parser;
/

SQL में टाइप घोषित करने का गुण यह है कि हम इसे FROM क्लॉज में इस तरह इस्तेमाल कर सकते हैं:

SQL> insert into t23
  2  select trim(column_value)
  3  from table(parser.my_parse('Fox in socks, Mr Knox, Sam-I-Am, The Lorax'))
  4  /

4 rows created.

SQL> select * from t23
  2  /

TXT
------------------------------------------------------------------------------
Fox in socks
Mr Knox
Sam-I-Am
The Lorax

SQL> 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cx_Oracle:मैं परिणाम सेट पर पुनरावृति कैसे करूं?

  2. Oracle UNION और ORDER BY के साथ जिज्ञासु मुद्दा

  3. SearchOracle.com पर एडीडीएम

  4. ORA-00904:इस उदाहरण में अमान्य पहचानकर्ता

  5. ऑरैकल डीबी में एकाधिक टेबल कैसे अपडेट करें?