समस्या यह है कि 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 वर्णों या उससे कम के प्रत्येक तत्व तक सीमित हैं, क्योंकि यह उद्धृत पहचानकर्ताओं पर भी प्रतिबंध है।