मैं इसी मुद्दे (11.2.0.3.0 और 12.1.0.2.0 दोनों में) पर चलता हूं। ऐसा लगता है कि आप XQuery_string के स्थान पर PL/SQL चर का उपयोग नहीं कर सकते xmltable पर जब क्वेरी स्ट्रिंग नामस्थान का संदर्भ देती है। ध्यान दें कि यदि आप किसी नामस्थान का संदर्भ नहीं देते हैं तो आप PL/SQL चर का उपयोग कर सकते हैं (नीचे उदाहरण #3 देखें)।
उठाया गया अपवाद विवरण :
यदि वास्तव में एक स्ट्रिंग अक्षर के बजाय एक चर का उपयोग करना ओरेकल द्वारा बहिष्कृत किया गया प्रतीत होता है। Oracle समर्थन दस्तावेज़ Doc ID 1490150.1 (केवल भुगतान करने वाले ग्राहकों के लिए उपलब्ध) से पता चलता है कि एक पैच है (मामला हमारे मामले से बिल्कुल समान नहीं है, लेकिन बहुत समान है) लेकिन दस्तावेज़ में यह भी कहा गया है कि:
- एक स्ट्रिंग अक्षर के बजाय एक चर का उपयोग करना SQL/XML मानक व्यवहार नहीं है
- रनटाइम के दौरान XPath/XQuery का निर्माण करने पर गंभीर प्रदर्शन दंड मिलता है
और इसलिए Oracle केवल स्ट्रिंग अक्षर का उपयोग करने की अनुशंसा करता है।
मेरा प्रारंभिक भ्रम Oracle के स्वयं के दस्तावेज़ीकरण (11.2) में निम्नलिखित विरोध के कारण हुआ था:
Oracle XML DB में XMLTABLE SQL/XML फ़ंक्शनए> XML DB डेवलपर गाइड में :
XMLTABLE डेटाबेस SQL भाषा संदर्भ में :
लापता "एक स्ट्रिंग अक्षर के रूप में" . पर ध्यान दें दूसरे उद्धरण से। और निश्चित रूप से मैंने पहले केवल डेटाबेस SQL भाषा संदर्भ read पढ़ा ...
XMLTABLE दस्तावेज़ीकरण को 12.1 संस्करण में ठीक कर दिया गया है। :
तो इसका उत्तर यह है कि किसी वैरिएबल का उपयोग XQuery_string . के रूप में न करें यहां तक कि यह संकलित भी करता है और कुछ मामलों में काम करने लगता है।
नीचे आपको समस्या को पुन:पेश करने के लिए न्यूनतम उदाहरण मिलेंगे:
उदाहरण #1
यह काम करता है और 'दिस इज ए' प्रिंट करता है। जैसी उम्मीद थी।
declare
v_xml constant xmltype := xmltype('
<ns:a
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="http://stackoverflow.com/users/272735/a">
<foo><bar>This is A.</bar></foo>
</ns:a>
');
v_content varchar2(100);
begin
select bar into v_content
from xmltable(
xmlnamespaces('http://stackoverflow.com/users/272735/a' as "ns")
,'/ns:a/foo' passing v_xml
columns
bar varchar2(4000) path 'bar'
);
dbms_output.put_line(v_content);
end;
/
उदाहरण #2
इसके साथ विफल रहता है:
ORA-19112: error raised during evaluation:
XVM-01081: [XPST0081] Invalid prefix
1 /ns:a/foo
- ^
declare
v_xml constant xmltype := xmltype('
<ns:a
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="http://stackoverflow.com/users/272735/a">
<foo><bar>This is A.</bar></foo>
</ns:a>
');
v_xquery_string constant varchar2(100) := '/ns:a/foo';
v_content varchar2(100);
begin
select bar into v_content
from xmltable(
xmlnamespaces('http://stackoverflow.com/users/272735/a' as "ns")
,v_xquery_string passing v_xml
columns
bar varchar2(4000) path 'bar'
);
dbms_output.put_line(v_content);
end;
/
उदाहरण #3
यह काम करता है और 'दिस इज ए' प्रिंट करता है। जैसी उम्मीद थी।
declare
v_xml constant xmltype := xmltype('<a><foo><bar>This is A.</bar></foo></a>');
v_xquery_string constant varchar2(100) := '/a/foo';
v_content varchar2(100);
begin
select bar into v_content
from xmltable(
v_xquery_string passing v_xml
columns
bar varchar2(4000) path 'bar'
);
dbms_output.put_line(v_content);
end;
/