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

Oracle में XMLTable में पथ को परिभाषित करने के लिए चर का उपयोग करना

मैं इसी मुद्दे (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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. समूह एसक्यूएल (ओरेकल) द्वारा कुल चल रहा है

  2. Oracle संग्रहित प्रक्रिया उदाहरण में तालिका प्रकार

  3. क्या बाएं बाहरी जुड़ाव की तुलना में एंटी-जॉइन अधिक कुशल है?

  4. सी # से ओरेकल संग्रहीत प्रक्रिया को कॉल करना?

  5. गणित कार्यों को हल करें PL/SQL