forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
132 lines
22 KiB
HTML
132 lines
22 KiB
HTML
<a name="EN-US_TOPIC_0000001233761811"></a><a name="EN-US_TOPIC_0000001233761811"></a>
|
|
|
|
<h1 class="topictitle1">Executing SQL Statements</h1>
|
|
<div id="body8662426"><div class="section" id="EN-US_TOPIC_0000001233761811__seedce51bc64543109debfe824b99d2a7"><h4 class="sectiontitle">Executing an Ordinary SQL Statement</h4><p id="EN-US_TOPIC_0000001233761811__a6e26fef4ac794cfaabb42a3cea83fcfd">The application performs data (parameter statements do not need to be transferred) in the database by running SQL statements, and you need to perform the following steps:</p>
|
|
<ol id="EN-US_TOPIC_0000001233761811__od80fab0b68a7455eba506f902f2a3ddd"><li id="EN-US_TOPIC_0000001233761811__laa5ea2f411964abe99583dd56f4b229f"><span>Create a statement object by triggering the createStatement method in Connection.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__scc7a46689b5044ce86d967a0e0aafa9f"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">Statement</span><span class="w"> </span><span class="n">stmt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">con</span><span class="p">.</span><span class="na">createStatement</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__le62d99553f0746dbb518c6b2aea025fb"><span>Execute the SQL statement by triggering the executeUpdate method in Statement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s3976853d48e44ddb8f8b20550b38aabc"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">stmt</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">(</span><span class="s">"CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<div class="note" id="EN-US_TOPIC_0000001233761811__note43018115566"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001233761811__p143015115613">If an execution request (not in a transaction block) received in the database contains multiple statements, the request is packed into a transaction. <strong id="EN-US_TOPIC_0000001233761811__b13904151317113">VACUUM</strong> is not supported in a transaction block. If one of the statements fails, the entire request will be rolled back.</p>
|
|
</div></div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__le872a5264dbc47f299fa6d0662cd3f19"><span>Close the statement object.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__sa336362225ba48a6b026d681cd042d6d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">stmt</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li></ol>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001233761811__s96c67fb12826423da676aaf61aefd78d"><h4 class="sectiontitle">Executing a Prepared SQL Statement</h4><p id="EN-US_TOPIC_0000001233761811__abc6c9fe498f64d7cb313b63993acb962">Pre-compiled statements were once complied and optimized and can have additional parameters for different usage. For the statements have been pre-compiled, the execution efficiency is greatly improved. If you want to execute a statement for several times, use a precompiled statement. Perform the following procedure:</p>
|
|
<ol id="EN-US_TOPIC_0000001233761811__o65a67c157f534f0eab08606102dfdc06"><li id="EN-US_TOPIC_0000001233761811__l2c51aa8a6d5b4f2ca549655c96d3c211"><span>Create a prepared statement object by calling the prepareStatement method in Connection.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__se8d919a71a924aca93b31078fa954f3b"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">PreparedStatement</span><span class="w"> </span><span class="n">pstmt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">con</span><span class="p">.</span><span class="na">prepareStatement</span><span class="p">(</span><span class="s">"UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l4ec8de48b6ab408fb3810cfcd330e3e3"><span>Set parameters by triggering the setShort method in PreparedStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s9db8278559c845bda8ffe2ff3b893caf"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">pstmt</span><span class="p">.</span><span class="na">setShort</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">short</span><span class="p">)</span><span class="mi">2</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__lb4b42c5c03ac4c22a069801f188925ac"><span>Execute the precompiled SQL statement by triggering the executeUpdate method in PreparedStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s6069f0ae2a7340729071d9acf1dbd2e7"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">rowcount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pstmt</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__la0935e0273e54c71b9b765ac69defd9a"><span>Close the precompiled statement object by calling the close method in PreparedStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s0580899445564489a15b4feceb1e1c95"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">pstmt</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li></ol>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001233761811__s4dfb9daec59d4f389cd34e3fb3f1721f"><h4 class="sectiontitle">Calling a Stored Procedure</h4><p id="EN-US_TOPIC_0000001233761811__a9c71a030be8a4e6eb4a9851de0aa38a3">Perform the following steps to call existing stored procedures through the JDBC interface in <span id="EN-US_TOPIC_0000001233761811__text248628301">GaussDB(DWS)</span>:</p>
|
|
<ol id="EN-US_TOPIC_0000001233761811__o751c2d03069f45e4a15357a061dca052"><li id="EN-US_TOPIC_0000001233761811__l6fc1a7bf8cae4abb99b65ab857738758"><span>Create a call statement object by calling the prepareCall method in Connection.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s1ddd5fad7b15406a969b75073d1fbf0f"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">CallableStatement</span><span class="w"> </span><span class="n">cstmt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">myConn</span><span class="p">.</span><span class="na">prepareCall</span><span class="p">(</span><span class="s">"{? = CALL TESTPROC(?,?,?)}"</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l97575c39321e44f49820c0eb746e8937"><span>Set parameters by calling the setInt method in CallableStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s2e0a94034ea84395a62e4029cedde964"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">cstmt</span><span class="p">.</span><span class="na">setInt</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="p">);</span><span class="w"> </span>
|
|
<span class="n">cstmt</span><span class="p">.</span><span class="na">setInt</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">);</span>
|
|
<span class="n">cstmt</span><span class="p">.</span><span class="na">setInt</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">90</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l8f820cede211424b8df7b4fc214546e2"><span>Register with an output parameter by calling the registerOutParameter method in CallableStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s9036a8e4e62345f694e3480fe9b1037a"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">cstmt</span><span class="p">.</span><span class="na">registerOutParameter</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">Types</span><span class="p">.</span><span class="na">INTEGER</span><span class="p">);</span><span class="w"> </span><span class="c1">//Register an OUT parameter as an integer.</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l2be612f25b38426e998bbc27f5fda479"><span>Call the stored procedure by calling the execute method in CallableStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s3cb03f117ad94b9ea57774ea6659a3fb"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">cstmt</span><span class="p">.</span><span class="na">execute</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l7a1a13697d8c45df82c4364a4f7877b0"><span>Obtain the output parameter by calling the getInt method in CallableStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s326c70e767be40a49f33cb3ad202a737"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cstmt</span><span class="p">.</span><span class="na">getInt</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span><span class="w"> </span><span class="c1">//Obtain the OUT parameter.</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001233761811__a48088eae82f94332b749f703b084d50e">For example:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001233761811__s9dfd0fc5586d464ebdf741ac5a35b8fc"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><span class="o">//</span><span class="n">The</span><span class="w"> </span><span class="n">following</span><span class="w"> </span><span class="n">stored</span><span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="n">has</span><span class="w"> </span><span class="n">been</span><span class="w"> </span><span class="n">created</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">OUT</span><span class="w"> </span><span class="k">parameter</span><span class="p">:</span>
|
|
<span class="k">create</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="k">replace</span><span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="n">testproc</span><span class="w"> </span>
|
|
<span class="p">(</span>
|
|
<span class="w"> </span><span class="n">psv_in1</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nb">integer</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">psv_in2</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nb">integer</span><span class="p">,</span>
|
|
<span class="w"> </span><span class="n">psv_inout</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="nb">integer</span>
|
|
<span class="p">)</span>
|
|
<span class="k">as</span>
|
|
<span class="k">begin</span>
|
|
<span class="w"> </span><span class="n">psv_inout</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">psv_in1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">psv_in2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">psv_inout</span><span class="p">;</span>
|
|
<span class="k">end</span><span class="p">;</span>
|
|
<span class="o">/</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__ld71588e036014fb3a389bf120f3f7e53"><span>Close the call statement by calling the close method in CallableStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s16070aa4eb274c66a438cddc0786c353"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">cstmt</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<div class="note" id="EN-US_TOPIC_0000001233761811__n4041a0742a4943618209e12e01e140a5"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><ul id="EN-US_TOPIC_0000001233761811__u1067bdd3f91e44669ff60f9f968b2a64"><li id="EN-US_TOPIC_0000001233761811__l2a64881c703e4cc4ad3dffae492827ed">Many database classes such as Connection, Statement, and ResultSet have a close() method. Close these classes after using their objects. Close these actions after using their objects. Closing Connection will close all the related Statements, and closing a Statement will close its ResultSet.</li><li id="EN-US_TOPIC_0000001233761811__lf026385f16664773928d36a986a22d0b">Some JDBC drivers support named parameters, which can be used to set parameters by name rather than sequence. If a parameter has a default value, you do not need to specify any parameter value but can use the default value directly. Even though the parameter sequence changes during a stored procedure, the application does not need to be modified. Currently, the <span id="EN-US_TOPIC_0000001233761811__text1887320570">GaussDB(DWS)</span> JDBC driver does not support this method.</li><li id="EN-US_TOPIC_0000001233761811__l7cd25cbe3a28413f9b24a6e195ef995a"><span id="EN-US_TOPIC_0000001233761811__text1316912952">GaussDB(DWS)</span> does not support functions containing OUT parameters, or default values of stored procedures and function parameters.</li></ul>
|
|
</div></div>
|
|
</p></li></ol>
|
|
<div class="notice" id="EN-US_TOPIC_0000001233761811__nb3c665c7bf30419bbb4a55a377541cb4"><span class="noticetitle"><img src="public_sys-resources/notice_3.0-en-us.png"> </span><div class="noticebody"><ul id="EN-US_TOPIC_0000001233761811__ul1572115984013"><li id="EN-US_TOPIC_0000001233761811__li1772459104010">If JDBC is used to call a stored procedure whose returned value is a cursor, the returned cursor cannot be used.</li><li id="EN-US_TOPIC_0000001233761811__li127235915404">A stored procedure and an SQL statement must be executed separately.</li></ul>
|
|
</div></div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001233761811__s3e1289baf28d4050a293e5819da47e59"><h4 class="sectiontitle">Batch Processing</h4><p id="EN-US_TOPIC_0000001233761811__a899a6b6f7ded4689a1ed8e6ec91dda51">When a prepared statement batch processes multiple pieces of similar data, the database creates only one execution plan. This improves the compilation and optimization efficiency. Perform the following procedure:</p>
|
|
<ol id="EN-US_TOPIC_0000001233761811__of226754e29b64759891afb1cc71be5c3"><li id="EN-US_TOPIC_0000001233761811__l47a34bc6658144f9baa7367bdb513a60"><span>Create a prepared statement object by calling the prepareStatement method in Connection.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s77c3aea59eab4c15bc4ed1fed424fc2e"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">PreparedStatement</span><span class="w"> </span><span class="n">pstmt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">con</span><span class="p">.</span><span class="na">prepareStatement</span><span class="p">(</span><span class="s">"INSERT INTO customer_t1 VALUES (?)"</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l50c0193581e94bb89dfd1035e345712f"><span>Call the setShort parameter for each piece of data, and call addBatch to confirm that the setting is complete.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__sa528a3d7ad4143e1a552bb9a4855c627"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">pstmt</span><span class="p">.</span><span class="na">setShort</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">short</span><span class="p">)</span><span class="mi">2</span><span class="p">);</span>
|
|
<span class="n">pstmt</span><span class="p">.</span><span class="na">addBatch</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__l25535c189a9c4fb9875dd132d8fb6d0d"><span>Execute batch processing by calling the executeBatch method in PreparedStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__saac2f60509f549ec912eee6a1a44af27"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">rowcount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pstmt</span><span class="p">.</span><span class="na">executeBatch</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</p></li><li id="EN-US_TOPIC_0000001233761811__lddc50a4ab6f44e538d59f9f38fddc2b2"><span>Close the precompiled statement object by calling the close method in PreparedStatement.</span><p><div class="codecoloring" codetype="Java" id="EN-US_TOPIC_0000001233761811__s1f852d944ed24af5b5cb0d3f95b7fe04"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">pstmt</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<div class="note" id="EN-US_TOPIC_0000001233761811__nca404e9c2a984980a0ae538c4c17ef72"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001233761811__a50e29b736bbd4c9db880ba54cf0e82a6">Do not terminate a batch processing action when it is ongoing; otherwise, the database performance will deteriorate. Therefore, disable the automatic submission function during batch processing, and manually submit every several lines. The statement for disabling automatic submission is <strong id="EN-US_TOPIC_0000001233761811__b842352706213448">conn.setAutoCommit(false)</strong>.</p>
|
|
</div></div>
|
|
</p></li></ol>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_04_0088.html">JDBC-Based Development</a></div>
|
|
</div>
|
|
</div>
|
|
|