Oracle डेटाबेस से SOAP संदेश भेजने और प्राप्त करने की आवश्यकता का सामना करना पड़ा।
साथ ही, यह समाधान सार्वभौमिक होना चाहिए और आसानी से अन्य मॉड्यूल के साथ मिलनसार होना चाहिए।
मुझे इंटरनेट पर ऐसा कुछ नहीं मिला। UTL_HTTP पैकेट का उपयोग करके SOAP संदेश भेजने के बारे में लेख हैं, लेकिन इससे अधिक कुछ नहीं।
मैंने Oracle डेटाबेस से SOAP संदेश भेजने के लिए एक सार्वभौमिक PL / SQL उत्पाद लिखने का निर्णय लिया जो कॉन्फ़िगर और एकीकृत करना आसान है।
तो चलिए शुरू करते हैं।
यह समाधान निम्नलिखित डेटाबेस ऑब्जेक्ट का उपयोग करता है:
- उपयोगकर्ता-निर्धारित डेटाटिप्स
- तालिका
- पैकेज
यह माना जाता है कि पाठक को यह बताने की आवश्यकता नहीं है कि एसओएपी, एक्सएमएल या ओरेकल डेटाबेस ऑब्जेक्ट क्या हैं।
स्थापना
इस समाधान को स्थापित करने के लिए, आपको निम्नलिखित वस्तुओं को स्थापित करना होगा
- PARAMS_RECORD टाइप करें
- PARAMS_ARRAY टाइप करें
- तालिका WS_SERVER
- तालिका WS_TEMPLATE
- तालिका WS_LOG
- WS पैकेज
स्रोत कोडअनुदेश
तालिकाओं की संरचना पर विचार करें

आइए उनमें से प्रत्येक पर अधिक विस्तार से विचार करें।
तालिका WS_SERVER
उन सर्वरों की सूची संग्रहीत करता है जहां SOAP / XML संदेश भेजे जाएंगे।
कॉलम SERVER_ID - सर्वर की तार्किक पहचानकर्ता। एक प्राथमिक कुंजी है
URL कॉलम - सेवा पथ
स्थिति - स्थिति। 1 - काम करता है। 0 - बंद। डिफ़ॉल्ट 1
तालिका WS_TEMPLATE
स्टोर SOAP / XML संदेश टेम्पलेट और कॉन्फ़िगरेशन जानकारी।
TEMPLATE_ID - टेम्पलेट की तार्किक पहचानकर्ता। एक प्राथमिक कुंजी है
TEMPLATE_XML - टेम्प्लेट (प्रारूप पर बाद में चर्चा की जाएगी)
SERVER_ID - सर्वर का तार्किक पहचानकर्ता। एक विदेशी कुंजी है जो तालिका को संदर्भित करता है WS_SERVER
REQUEST_PARAMS - अनुरोध पैरामीटर (प्रारूप पर बाद में चर्चा की जाएगी)
RESPONSE_PARAMS - प्रतिक्रिया पैरामीटर (प्रारूप पर बाद में चर्चा की जाएगी)
XMLNS - नामस्थान
पथ - एक्सएमएल पथ (नीचे दिए गए उदाहरण का उपयोग करके अधिक विस्तार से चर्चा की जाएगी)
स्थिति - स्थिति। 1 - काम करता है। 0 - बंद। डिफ़ॉल्ट 1
तालिका WS_LOG
संचालन के बारे में लॉग रखता है।
EVENT_TIME - ऑपरेशन का समय
XML_REQUEST - XML / SOAP अनुरोध
XML_RESPONSE - XML / SOAP प्रतिक्रिया
REQUEST_PARAMS - अनुरोध पैरामीटर
RESPONSE_PARAMS - प्रतिसाद पैरामीटर
रिटेल - पूर्ण अनुरोध की स्थिति के बारे में जानकारी। सफलतापूर्वक अगर> 0
RETMSG - पूर्ण अनुरोध के बारे में जानकारी। असफल अनुरोध के मामले में त्रुटि कोड
EXECUTE_TIME - सेकंड, और मिलीसेकंड में, अनुरोध को निष्पादित करने के लिए खर्च किया गया
TEMPLATE_XML टेम्प्लेट को कैसे आबाद करें
XML फ़ाइल अपने आप यहाँ फिट होती है, जो निम्न पैरामीटर्स में इनपुट के लिए आवश्यक पैरामीटर
%PARAMETER_NAME%
प्रतिस्थापित करती है।
उदाहरण के लिए:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>%NAME%</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
इस मामले में, इस अनुरोध को भेजने के लिए, हमें इस कॉलम में इस प्रारूप में एक मूल्य लिखना होगा। कार्यक्रम खुद को इसी पैरामीटर के साथ प्रतिस्थापित करता है (पैरामीटर नीचे चर्चा की गई हैं)।
<m:StockName>%NAME%</m:StockName>
यदि, तदनुसार, कई मान हैं जो हस्तक्षेप नहीं करते हैं, तो उन्हें तुरंत संकेत दिया जाना चाहिए:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>%NAME%</m:StockName> <m:StockCount>%COUNT%</m:StockCount> </m:GetStockPrice> </soap:Body> </soap:Envelope>
जैसा कि आप देख सकते हैं, 2 चर
NAME
और
COUNT
संकेतित हैं।
<m:StockName>%NAME%</m:StockName> <m:StockCount>%COUNT%</m:StockCount>
पैरामीटर भरने का नियम (REQUEST_PARAMS और RESPONSE_PARAMS कॉलम)
यह कॉलम निम्नलिखित प्रारूप में भरा गया है।
PARAMETER_NAME_1={VALUE_1}|PARAMETER_NAME_2={VALUE_2}|…PARAMETER_NAME_N={VALUE_N}
क्वेरी पैरामीटर (REQUEST_PARAMS कॉलम)
यदि अनुरोध की परवाह किए बिना निरंतर चर हैं, तो यह कॉलम भरा हुआ है। मूल रूप से, इसे खाली छोड़ा जा सकता है। यह मान तब सेट किया जाता है जब मुख्य प्रक्रिया शुरू होती है। इसके बारे में थोड़ा और आगे।
स्तंभ PATH
सर्वर से रिस्पांस के साथ काम को कॉन्फ़िगर करने के लिए, PATH कॉलम को भरना होगा, जिसमें XML में पथ को इंगित करता है (जिसके बीच टैग) आवश्यक उत्तर क्रॉस्ड है।
SOAP / XML संदेश भेजते समय, सर्वर से आने वाली संभावित प्रतिक्रिया पहले से ज्ञात होती है।
उदाहरण के लिए, उत्तर निम्नलिखित SOAP / XML हो सकता है
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
इस स्थिति में, PATH कॉलम को इस प्रकार लिखा जाना चाहिए:
/soap:Envelope/soap:Body/m:GetStockPriceResponse
जैसा कि आप उत्तर से देख सकते हैं, इस तरह से आवश्यक मूल्य है
<m:Price>34.5</m:Price>
प्रतिक्रिया पैरामीटर (RESPONSE_PARAMS कॉलम)
यह कॉलम आवश्यक है। प्रारूप समान (ऊपर) रहता है।
प्रतिक्रिया प्रारूप को पहले से जानते हुए, इस कॉलम में पैरामीटर लिखना आवश्यक है।
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
पथ स्तंभ में हमारे लिए आवश्यक पथ को पहले ही इंगित करने के बाद, हम यहाँ निम्न प्रारूप में आवश्यक मान दर्ज करते हैं:
RESULT_PRICE={m:Price}
इसका अर्थ है RESULT_PRICE को
m:Price
एसओएपी / एक्सएमएल रिस्पांस से प्राप्त
m:Price
मूल्य। आगे एक उदाहरण पर इसे और अधिक विस्तार से माना जाएगा।
XMLNS कॉलम
यह नाम स्थान स्तंभ। यह SOAP / XML रिक्वेस्ट से उसी तरह भरा जाता है।
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>%NAME%</m:StockName> <m:StockCount>%COUNT%</m:StockCount> </m:GetStockPrice> </soap:Body> </soap:Envelope>
इस अनुरोध से इस कॉलम को सभी
xmlns
प्रविष्ट करना होगा। इस उदाहरण से, आपको इसे निम्नलिखित मूल्य से भरना होगा:
xmlns:soap="http://www.w3.org/2001/12/soap-envelope" xmlns:m="http://www.example.org/stock"
प्रक्रिया शुरू
अब पैकेज की संरचना और चलने के नियमों पर विचार करें।
पैकेज विनिर्देश इस प्रकार है:
create or replace package WS is PROCEDURE add_param(pi_params in out varchar2, pi_parameter_name varchar2, pi_parameter_value varchar2); FUNCTION get_param(pi_params varchar2, pi_parameter_name varchar2) return varchar2; PROCEDURE call(pi_template_id VARCHAR2, pi_params VARCHAR2, po_params OUT VARCHAR2, po_data_response OUT VARCHAR2); end WS;
आइए प्रत्येक फ़ंक्शन पर अधिक विस्तार से विचार करें।
उदाहरण के रूप में उनमें से प्रत्येक का उपयोग एकीकरण अनुभाग में चर्चा की जाएगी।
Add_param प्रक्रिया
एक पैरामीटर जोड़ने / बनाने के लिए उपयोग किया जाता है।
मापदंडों
pi_params - पैरामीटर स्ट्रिंग चर
pi_parameter_name - जोड़े गए पैरामीटर का नाम
pi_parameter_value - जोड़े गए पैरामीटर का मान
Get_param फ़ंक्शन
पैरामीटर स्ट्रिंग से एक पैरामीटर प्राप्त करने के लिए उपयोग किया जाता है।
मापदंडों
pi_params - पैरामीटर स्ट्रिंग चर
pi_parameter_name - पुनर्प्राप्त करने के लिए पैरामीटर का नाम
कॉल प्रक्रिया
यह मुख्य है और इस प्रक्रिया को स्वयं शुरू करता है।
मापदंडों
pi_template_id - तालिका से टेम्पलेट ID WS_TEMPLATE
pi_params - भेजने के लिए आवश्यक पैरामीटर स्ट्रिंग चर
po_params - सर्वर से प्रतिक्रिया में प्राप्त पैरामीटर स्ट्रिंग चर
po_data_response - सर्वर से XML प्रतिक्रिया (आप इस चर का उपयोग नहीं कर सकते हैं)
अगला भाग एक उदाहरण के रूप में पैकेज प्रक्रियाओं का उपयोग करेगा।
एकीकरण
इस खंड में, हम एक काल्पनिक परियोजना के उदाहरण का उपयोग करके इस समाधान के एकीकरण पर विचार करेंगे।
मान लीजिए कि कोई समस्या है:
अंत उपयोगकर्ता के लिए सर्वर के साथ बातचीत के लिए एक इंटरफ़ेस बनाएँ जो निम्नलिखित संचालन करने में सक्षम होना चाहिए
- उत्पाद जानकारी प्राप्त करना
- उत्पाद जोड़ें
कार्यान्वयन योजना इस प्रकार है:

मैं ध्यान देता हूं कि अंत उपयोगकर्ता और डेटाबेस के बीच का इंटरफ़ेस कोई भी हो सकता है। अंतिम उपयोगकर्ता SQL के माध्यम से सीधे प्रक्रिया शुरू कर सकता है, या इसे एक तृतीय-पक्ष एप्लिकेशन (उदाहरण के लिए, जावा एसई, जावा ईई, आदि) द्वारा बुलाया जा सकता है।
निम्नलिखित जानकारी प्रदान की गई है:
स्वयं वेब सेवा
http://10.10.1.100:8080/GoodsManagementWS/Goods
यह ध्यान दिया जाना चाहिए कि सर्वर को SOAP / XML संदेश भेजने से पहले, बाद वाले को ACL में जोड़ा जाना चाहिए। ऐसा करने के लिए, डेटाबेस व्यवस्थापक से संपर्क करें। साथ ही इंटरनेट पर भी इस बारे में जानकारी है। मुझे लगता है कि आपको इस लेख में इस पर विचार नहीं करना चाहिए।
अनुरोध के उदाहरण
उत्पाद जानकारी
प्रश्न:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/goods"> <m:GetInfo> <m:ID>1</m:ID> </m: GetInfo > </soap:Body> </soap:Envelope>
उत्तर है:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/goods"> <m:Response> <m:Name>Printer</m:Name> <m:Vendor>HP</m:Vendor> <m:Price>Printer</m:Price> <m:Count>Printer</m:Count> </m:Response> </soap:Body> </soap:Envelope>
एक उत्पाद जोड़ना
प्रश्न:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/goods"> <m:Add> <m:Name>Printer</m:Name> <m:Vendor>HP</m:Vendor> <m:Price>Printer</m:Price> <m:Count>Printer</m:Count> </m: Add > </soap:Body> </soap:Envelope>
उत्तर है:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/goods"> <m:Response> <m:id>1</m:id> </m:Response> </soap:Body> </soap:Envelope>
हमें ग्राहक से आवश्यक डेटा प्राप्त हुआ। सेटअप और एकीकरण के साथ शुरुआत करना।
सबसे पहले, आपको सर्वर के बारे में जानकारी रिकॉर्ड करनी होगी:
INSERT INTO WS_SERVER (SERVER_ID, URL, STATUS) VALUES ('Store', 'http://10.10.1.100:8080/GoodsManagementWS/Goods', 1);
अगला, आपको
WS_TEMPLATE
तालिका में क्वेरी पैटर्न के बारे में जानकारी लिखने की आवश्यकता है
उत्पाद जानकारी
INSERT INTO WS_TEMPLATE (TEMPLATE_ID, TEMPLATE_XML, SERVER_ID, REQUEST_PARAMS, RESPONSE_PARAMS, XMLNS, PATH, STATUS) VALUES ('GetInfo',
एक उत्पाद जोड़ना
INSERT INTO WS_TEMPLATE (TEMPLATE_ID, TEMPLATE_XML, SERVER_ID, REQUEST_PARAMS, RESPONSE_PARAMS, XMLNS, PATH, STATUS) VALUES ('AddInfo',
और अब, सभी आवश्यक सूचनाओं को जोड़ते हुए, प्रक्रिया शुरू की जा सकती है। लेकिन इसके लिए इस परियोजना के लिए प्रक्रियाओं को लिखना आवश्यक है, जो बदले में WS पैकेज से प्रक्रियाओं का उपयोग करता है।
उत्पाद जानकारी को पुनः प्राप्त करना
इस कार्य के लिए, अंतिम प्रक्रिया निम्नानुसार दिखाई देगी
CREATE OR REPLACE PROCEDURE GET_INFO(PI_ID VARCHAR2, PO_NAME OUT VARCHAR2, PO_VENDOR OUT VARCHAR2, PO_PRICE OUT NUMBER, PO_COUNT OUT NUMBER) IS v_template_id VARCHAR2(100) := 'GetInfo'; v_data_response VARCHAR2(4000); v_request_params VARCHAR2(4000); v_response_params VARCHAR2(4000); BEGIN
पैकेज भेजने, भेजने, परिणाम प्राप्त करने के लिए एक SOAP संदेश तैयार करेगा, और परिणामस्वरूप, अंतिम प्रक्रिया की परिणामी प्रतिक्रिया get_param प्रक्रिया द्वारा प्राप्त मान होगी। आप पैरामीटर सूची RESPONSE_PARAMS से कोई भी पैरामीटर प्राप्त कर सकते हैं और परिणामस्वरूप वापस आ सकते हैं।
एक उत्पाद जोड़ना
इस कार्य के लिए, अंतिम प्रक्रिया निम्नानुसार दिखाई देगी
PROCEDURE ADD_INFO(PI_NAME VARCHAR2, PI_VENDOR VARCHAR2, PI_PRICE NUMBER, PI_COUNT NUMBER, PO_ID OUT VARCHAR2) IS v_template_id VARCHAR2(100) := 'AddInfo'; v_data_response VARCHAR2(4000); v_request_params VARCHAR2(4000); v_response_params VARCHAR2(4000); BEGIN
इस प्रक्रिया में कई इनपुट पैरामीटर हैं, और परिणामस्वरूप चर एक है।
और इसलिए, अंत में हमें 2 प्रक्रियाएं मिलीं जो कार्य करती हैं। क्वेरी परिणाम तालिका
WS_LOG
में लॉग किए गए हैं
अतिरिक्त प्रश्न
क्या होगा अगर प्रतिक्रिया में आवश्यक डेटा अलग-अलग तरीकों से हो?
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/goods"> <m:Response1> <m:id>1</m:id> </m:Response1> <m:Response2> <m:id>1</m:id> </m:Response2> <m:Response3> <m:id>1</m:id> </m:Response3> </soap:Body> </soap:Envelope>
इस मामले में, PATH
/soap:Envelope/soap:Body
लिखता है। चूंकि आवश्यक उत्तर
<soap:Body> </soap:Body>
टैग के बीच है। और पहले से ही RESPONSE_PARAMS को थोड़ा और विस्तार से लिखना होगा।
ID1={m:Response1/m:id}|ID2={m:Response2/m:id}|ID3={m:Response3/m:id}
क्या होगा यदि SOAP / XML अनुरोध और प्रतिक्रिया सबसे सरल हो?
जांच
<Request> <Data>Test</Data> </Request>
जवाब है
<Response> <Result>DONE</Result> <Response>
इस मामले में, सब कुछ एक समान तरीके से कॉन्फ़िगर किया गया है।
तदनुसार, XMLNS खाली है, PATH
Response
और RESPONSE_PARAMS
RES={Result}
। मैं ध्यान देता हूं कि चर नाम को मनमाने ढंग से निर्दिष्ट किया गया है, लेकिन इसका उपयोग get_param
get_param
में अनुरोध के लिए किया जाएगा
यदि मैं प्रक्रिया शुरू करते समय REQUEST_PARAMS पंक्ति दर्ज करता हूं, तो मुझे WS_TEMPLATE तालिका में REQUEST_PARAMS कॉलम की आवश्यकता क्यों है?
SOAP / XML अनुरोध में परिवर्तन नहीं होने पर यह कॉलम आवश्यक है। प्रक्रिया की शुरुआत के दौरान उन्हें इस कॉलम में निर्दिष्ट करके, इन मापदंडों (एड_परम प्रक्रिया) को जोड़ने की कोई आवश्यकता नहीं है क्योंकि वे पहले से ही डिफ़ॉल्ट रूप से जोड़े गए हैं।
वह सब
मैंने पर्याप्त जानकारी देने की कोशिश की।
मुझे उन सवालों को सुनने और उनका जवाब देने में खुशी होगी। साथ ही आलोचना, सुझाव और सुझाव।
निर्णय हाल ही में लिखा गया था। इसलिए ऐसी चीजें हैं जिन्हें आप निखार सकते हैं।
आपका धन्यवाद आशा है कि लेख उपयोगी रहा है।