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

एसक्यूएल डेवलपर में चर को बांधने के लिए सूची

समस्या यह है कि dbms_utility.comma_to_table प्रक्रिया सूची के तत्वों को वैध ओरेकल पहचानकर्ता होने की आवश्यकता है, हालांकि यह वास्तव में दस्तावेज़ों में स्पष्ट नहीं किया गया है। यह आस्कटॉम लेख हालांकि, अंतर्निहित name_tokenize प्रक्रिया :

इसका बाइंडिंग या SQL डेवलपर से कोई लेना-देना नहीं है, यह एक डेटाबेस प्रतिबंध है।

यदि आप dbms_utility.comma_to_table को कॉल करते हैं, तो आप उसी प्रकार की त्रुटि देख सकते हैं सीधे प्रक्रिया:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('USER', len, arr);
end;
/

Error report -
ORA-20001: comma-separated list invalid near R
ORA-06512: at "SYS.DBMS_UTILITY", line 236
ORA-06512: at "SYS.DBMS_UTILITY", line 256
ORA-06512: at line 5

या dbms_utility.name_tokenize . पर कॉल करके सीधे:

declare
  a varchar2(30);
  b varchar2(30);
  c varchar2(30);
  d varchar2(30);
  e binary_integer;
begin
  dbms_utility.name_tokenize('USER', a, b, c, d, e);
end;
/

Error report -
ORA-00931: missing identifier
ORA-06512: at "SYS.DBMS_UTILITY", line 167
ORA-06512: at line 8
00931. 00000 -  "missing identifier"

यदि आपके अल्पविराम द्वारा अलग किए गए मान आरक्षित शब्द या किसी अन्य कारण से पहचानकर्ता के रूप में अनुमति नहीं है; उदाहरण के लिए, एक संख्या से शुरू करना। यदि सूची में TABLE . है तो आपको वही समस्या मिलेगी या 42TAB . यह वास्तव में इसके लिए अभिप्रेत नहीं है, जैसा कि टॉम ने उल्लेख किया है।

आप सभी तत्वों को दोहरा-उद्धृत करने के लिए मजबूर करके प्रतिबंधों को आंशिक रूप से प्राप्त कर सकते हैं, जिसे आप replace के साथ कर सकते हैं . और फिर उनमें से किसी भी उदाहरण की अनुमति है:

declare
  arr dbms_utility.uncl_array;
  len binary_integer;
begin
  dbms_utility.comma_to_table('"USER","TABLE","42TAB"', len, arr);
end;
/

anonymous block completed

तो अपने कोड के लिए, iv_raw को संशोधित करें जैसे ही आप इसे पार करते हैं, और फिर प्रत्येक लौटाए गए मान से डबल-कोट्स हटा दें:

FUNCTION comma_to_table(iv_raw IN VARCHAR2)
  RETURN bind_tab_typ
  PIPELINED
  IS
     ltab_lname dbms_utility.lname_array;
     ln_len     BINARY_INTEGER;
  BEGIN
     dbms_utility.comma_to_table(list   => '"' || replace(iv_raw, ',', '","') || '"'
                                ,tablen => ln_len
                                ,tab    => ltab_lname);
     FOR i IN 1 .. ln_len LOOP
        PIPE ROW (replace(ltab_lname(i), '"'));
     END LOOP;
  END comma_to_table;

तब यह काम करता है:

select * from table(ui_util.comma_to_table('USER,TABLE,42T'));

COLUMN_VALUE
--------------------
USER
TABLE
42T

लेकिन आप अभी भी 30 वर्णों या उससे कम के प्रत्येक तत्व तक सीमित हैं, क्योंकि यह उद्धृत पहचानकर्ताओं पर भी प्रतिबंध है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mybatis के साथ बैच डालने के लिए foreach का उपयोग करना

  2. क्लॉज और सबक्वायरी के बीच अंतर?

  3. Oracle-ADF एप्लिकेशन को Tomcat 7 पर तैनात करने का प्रयास कर रहा है

  4. Oracle JDBC ड्राइवर निहित कैशिंग सुविधा का उपयोग करना

  5. बैश चर का उपयोग करते समय Sqlplus लॉगिन त्रुटि:SP2-0306:अमान्य विकल्प