﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-果酱-文章分类-SQL相关</title><link>http://www.blogjava.net/chen45257211/category/49111.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 03 Aug 2011 03:43:37 GMT</lastBuildDate><pubDate>Wed, 03 Aug 2011 03:43:37 GMT</pubDate><ttl>60</ttl><item><title>SQL中的各种JOIN（inner join,full outer join,left join,right join,cross join ）（转载）</title><link>http://www.blogjava.net/chen45257211/articles/355633.html</link><dc:creator>七孑</dc:creator><author>七孑</author><pubDate>Wed, 03 Aug 2011 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/chen45257211/articles/355633.html</guid><wfw:comment>http://www.blogjava.net/chen45257211/comments/355633.html</wfw:comment><comments>http://www.blogjava.net/chen45257211/articles/355633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chen45257211/comments/commentRss/355633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chen45257211/services/trackbacks/355633.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: #868374; "><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-align: left; "><font size="3"><font color="#000000">a. 交叉连接</font></font><font size="3"><font color="#000000"><span>CROSS JOIN<br /></span>如果不带WHERE条件子句，它将会返回被连接的两个表的笛卡尔积，返回结果的行数等于两个表行数的乘积；</font></font><br /><br /><font color="#000000" size="3">举例,下列A、B、<span>C&nbsp;</span>执行结果相同，但是效率不一样：</font><span><br /><font size="3"><font color="#000000">A:SELECT * FROM table1 CROSS JOIN table2<br />B:SELECT * FROM table1,table2</font></font></span></p></span><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font size="3"><font color="#000000">C:<span>select * from table1 a inner join table2 b</span></font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><span><br /><font color="#000000" size="3">A:select a.*,b.* from table1 a,table2 b where a.id=b.id<br />B:select * from table1 a cross join table2 b where a.id=b.id (</font></span><span><font size="3"><font color="#000000">注：<span>cross join</span>后加条件只能用where,不能用on)</font></font></span><br /><font color="#000000" size="3">C:</font><font size="3"><font color="#000000"><span>select * from table1 a inner join table2 b on a.id=b.id</span></font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><br /><font color="#000000" size="3">一般不建议使用方法<span>A和B，因为如果有WHERE子句的话，往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。</span></font><font size="3"><font color="#000000"><span>&nbsp;<br /></span>因此，如果两个需要求交际的表太大，将会非常非常慢，不建议使用。</font></font><br /><br /><font color="#000000" size="3">b.&nbsp;</font><font color="#000000" size="3">内连接</font><font size="3"><font color="#000000"><span>INNER JOIN<br /></span>两边表同时符合条件的组合</font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><span><font color="#000000" size="3">如果仅仅使用</font><span><br /><font size="3"><font color="#000000">SELECT * FROM table1 INNER JOIN table2</font></font></span></span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font color="#000000" size="3">内连接如果没有指定连接条件的话，和笛卡尔积的交叉连接结果一样，但是不同于笛卡尔积的地方是，没有笛卡尔积那么复杂要先生成行数乘积的数据表，内连接的效率要高于笛卡尔积的交叉连接。</font><span><br /><br /><font size="3"><font color="#000000">但是通常情况下，使用<span>INNER JOIN</span>需要指定连接条件。</font></font></span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font size="3"><font color="#000000">***************关于等值连接和自然连接</font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font size="3"><font color="#000000">等值连接<span>(=号应用于连接条件<span>,&nbsp;</span>不会去除重复的列)</span></font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font size="3"><font color="#000000">自然连接(会去除重复的列)</font></font></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><font color="#000000" size="3">数据库的连接运算都是自然连接，因为不允许有重复的行（元组）存在。</font><br /><font size="3"><font color="#000000">例如：</font></font></p></span><br /><span class="Apple-style-span" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; "><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: white; text-align: left; background-position: 0% 0%; background-repeat: repeat repeat; "><span><font color="#000000" size="3">SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column<br /><br />c.&nbsp;</font></span><span><font color="#000000" size="3">外连接</font><font size="3"><font color="#000000"><span>OUTER JOIN<br /></span>指定条件的内连接，仅仅返回符合连接条件的条目。</font></font><br /><font color="#000000" size="3">外连接则不同，返回的结果不仅包含符合连接条件的行，而且包括左表(左外连接时<span>),&nbsp;</span>右表(右连接时)或者两边连接(全外连接时)的所有数据行。</font><br /><br /><font color="#000000" size="3">1)</font><font color="#000000" size="3">左外连接</font><font size="3"><font color="#000000"><span>LEFT [OUTER] JOIN&nbsp;<br /></span>显示符合条件的数据行，同时显示左边数据表不符合条件的数据行，右边没有对应的条目显示</font></font><font size="3"><font color="#000000">NULL<br />例如</font></font><span><br /><font color="#000000" size="3">SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column<br />2)</font></span><font color="#000000" size="3">右外连接</font><font size="3"><font color="#000000"><span>RIGHT [OUTER] JOIN<br /></span>显示符合条件的数据行，同时显示右边数据表不符合条件的数据行，左边没有对应的条目显示</font></font><font size="3"><font color="#000000">NULL<br />例如</font></font><span><br /><font color="#000000" size="3">SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column<br />3)</font></span><font color="#000000" size="3">全外连接</font><font size="3"><font color="#000000"><span>full [outer] join<br /></span>显示符合条件的数据行，同时显示左右不符合条件的数据行，相应的左右两边显示NULL，即显示左连接、右连接和内连接的并集<br /><br />文章来源：<br /><div><a href="http://www.blogjava.net/algz/articles/228218.html">http://www.blogjava.net/algz/articles/228218.html</a></div></font></font></span></p></span><img src ="http://www.blogjava.net/chen45257211/aggbug/355633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chen45257211/" target="_blank">七孑</a> 2011-08-03 09:27 <a href="http://www.blogjava.net/chen45257211/articles/355633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 调用存储过程 实例(转)</title><link>http://www.blogjava.net/chen45257211/articles/354549.html</link><dc:creator>七孑</dc:creator><author>七孑</author><pubDate>Mon, 18 Jul 2011 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/chen45257211/articles/354549.html</guid><wfw:comment>http://www.blogjava.net/chen45257211/comments/354549.html</wfw:comment><comments>http://www.blogjava.net/chen45257211/articles/354549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chen45257211/comments/commentRss/354549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chen45257211/services/trackbacks/354549.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 25px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">共4个</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一.只有输入参数没有返回结果的存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">二. 有输入和有一个返回值的存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">三、返回多行记录的存储过程（返回的是游标）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">四、Hibernate调用oracle存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一.只有输入参数没有返回结果的存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">建表 create table table_1(id varchar2(10),name varchar2(10));</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">--没有返回值的存储过程<br /><span style="color: #ff0000; ">create or replace procedure prc_1(t_id in varchar2,t_name in varchar2)<br />as&nbsp;<br />&nbsp;begin&nbsp;<br />&nbsp; insert into table_1 values(t_id,t_name);&nbsp;<br />end prc_1;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1.在sql plus 中执行<br /><span style="color: #ff0000; ">SQL&gt; exec prc_1('1','杨2');</span><br />PL/SQL procedure successfully completed</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2. 在java 中执行，返回结果<br />&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("oracle.jdbc.OracleDriver").newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";<br />&nbsp;&nbsp;&nbsp;&nbsp; String user = "atf_ygj";<br />&nbsp;&nbsp;&nbsp;&nbsp; String password = "mas123";<br />&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection(url, user, password);<br />&nbsp;&nbsp;&nbsp;&nbsp; conn.setAutoCommit(false);<br />&nbsp;<span style="color: #ff0000; ">&nbsp;&nbsp;&nbsp; cstmt = conn.prepareCall("{ call prc_1(?,?) }");<br />&nbsp;&nbsp;&nbsp;&nbsp; cstmt.setString(1, "100");</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">&nbsp;&nbsp;&nbsp;&nbsp; cstmt.setString(2, "TestOne");</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">&nbsp;&nbsp;&nbsp;&nbsp; cstmt.execute();<br /></span>&nbsp;&nbsp;&nbsp;&nbsp; conn.commit();</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">========================================</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">二. 有输入和有一个返回值的存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">--有一个返回值的存储过程<br /><span style="color: #ff0000; ">create or replace procedure prc_2(t_id IN VARCHAR2,t_name OUT VARCHAR2)&nbsp; AS<br />begin<br />&nbsp;&nbsp; SELECT name INTO t_name FROM table_1 WHERE id= t_id and rownum&lt;2;&nbsp;<br />end prc_2;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1. 在sql plus中执行，返回结果<br /><span style="color: #ff0000; ">SQL&gt; var name varchar2(100);<br />SQL&gt; exec prc_2('1',<span style="background-color: #ffff00; ">:</span>name);</span><br />PL/SQL procedure successfully completed<br />name<br />---------<br />杨2</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />2. 在java 中执行，返回结果<br />&nbsp;Class.forName("oracle.jdbc.OracleDriver").newInstance();<br />&nbsp;String url = "jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";<br />&nbsp;String user = "atf_ygj";<br />&nbsp;String password = "mas123";<br />&nbsp;conn = DriverManager.getConnection(url, user, password);<br />&nbsp;conn.setAutoCommit(false);<br />&nbsp;<span style="color: #ff0000; ">cstmt = conn.prepareCall("{ call prc_2(?,?) }");<br />&nbsp;cstmt.setString(1, "1");<br />&nbsp;cstmt.registerOutParameter(2, Types.VARCHAR);<br />&nbsp;cstmt.execute();<br /></span>&nbsp;conn.commit();<br />&nbsp;String testPrint = cstmt.getString(2);<br />&nbsp;System.out.println("返回值：：：：：： " + testPrint);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">输出：<br />返回值：：：：：： 杨2</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">三、返回多行记录的存储过程（返回的是游标）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">由于oracle存储过程没有返回值，它的所有返回值都是通过out参数来替代的，列表同样也不例外，但由于是集合，所以不能用一般的参数，必须要用pagkage了.所以要分两部分，</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">1，&nbsp; 建一个程序包。<br />create or replace package test_package as<br />&nbsp;type test_CURSOR is ref cursor;<br />end test_package;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">2，建立存储过程，存储过程为：<br />create or replace procedure prc_3(p_CURSOR out test_package.test_CURSOR) is&nbsp;<br />begin<br />&nbsp;&nbsp;&nbsp; OPEN p_CURSOR FOR SELECT * FROM table_1 order by id;<br />end prc_3;<br /></span>可以看到，它是把游标（可以理解为一个指针），作为一个out 参数来返回值的。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />===========================<br />3.在java中的执行<br />&nbsp; Class.forName("oracle.jdbc.OracleDriver").newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp; String url = "jdbc:oracle:thin:atf_ygj/mas123@192.168.6.19:1531:orcl";<br />&nbsp;&nbsp;&nbsp;&nbsp; String user = "atf_ygj";<br />&nbsp;&nbsp;&nbsp;&nbsp; String password = "mas123";<br />&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection(url, user, password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">cstmt = conn.prepareCall("{ call prc_3(?) }");<br />&nbsp;&nbsp;&nbsp;&nbsp; cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);<br />&nbsp;&nbsp;&nbsp;&nbsp; cstmt.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp; rs = (ResultSet) cstmt.getObject(1);<br /></span>&nbsp;&nbsp;&nbsp;&nbsp; while (rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("&lt;tr&gt;&lt;td&gt;" + rs.getString(1) + "&lt;/td&gt;&lt;td&gt;" + rs.getString(2) + "&lt;/td&gt;&lt;/tr&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />输出结果：<br />&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;杨2&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;TestOne&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;杨1&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;TestOne&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;Test2&lt;/td&gt;&lt;/tr&gt;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">4.在sql plus中执行<br />用一个存储过程调用prc_3</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">create or replace procedure prc_4 is<br /><span style="color: #ff0000; ">c test_package.test_CURSOR;</span>&nbsp;<br />id varchar2(100);&nbsp;<br />name varchar2(100);&nbsp;<br />begin&nbsp;<br />prc_3(c);&nbsp;<br />LOOP&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; FETCH c INTO id,name;&nbsp;<br />EXIT WHEN c%NOTFOUND;&nbsp;<br />DBMS_OUTPUT.PUT_LINE('=='||id||'==='||name);&nbsp;<br />END LOOP;&nbsp;<br />CLOSE c;&nbsp;<br />end prc_4;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">执行<br /><span style="color: #ff0000; ">SQL&gt; set serveroutput on;<br />SQL&gt; exec dbms_output.enable(999999999999999999999);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">PL/SQL procedure successfully completed</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff0000; ">SQL&gt; exec prc_4;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">==1===杨2<br />==100===TestOne<br />==100===杨1<br />==100===TestOne<br />==200===Test2</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">PL/SQL procedure successfully completed</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">四、Hibernate调用oracle存储过程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">private void prc_test()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;getHibernateTemplate().execute(new HibernateCallback()<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session) throws HibernateException, SQLException<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br /><span style="color: #ff0000; ">&nbsp;&nbsp;CallableStatement cstmt = session.connection().prepareCall("{ call prc_3(?) }");<br />&nbsp;&nbsp;cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);<br />&nbsp;&nbsp;cstmt.execute();<br />&nbsp;&nbsp;ResultSet rs = (ResultSet) cstmt.getObject(1);<br /></span>&nbsp;&nbsp;while (rs.next())<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("&lt;tr&gt;&lt;td&gt;" + rs.getString(1) + "&lt;/td&gt;&lt;td&gt;" + rs.getString(2) + "&lt;/td&gt;&lt;/tr&gt;");<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;}, true);<br />&nbsp;&nbsp;&nbsp; }<br /><br />文章来源：</p></span><span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 25px; "><a href="http://dolphin-ygj.iteye.com/blog/436936">http://dolphin-ygj.iteye.com/blog/436936</a></span><span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 25px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /></p></span><img src ="http://www.blogjava.net/chen45257211/aggbug/354549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chen45257211/" target="_blank">七孑</a> 2011-07-18 18:02 <a href="http://www.blogjava.net/chen45257211/articles/354549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用存储过程语法收藏</title><link>http://www.blogjava.net/chen45257211/articles/354547.html</link><dc:creator>七孑</dc:creator><author>七孑</author><pubDate>Mon, 18 Jul 2011 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/chen45257211/articles/354547.html</guid><wfw:comment>http://www.blogjava.net/chen45257211/comments/354547.html</wfw:comment><comments>http://www.blogjava.net/chen45257211/articles/354547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chen45257211/comments/commentRss/354547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chen45257211/services/trackbacks/354547.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: simsun; line-height: 23px; ">一.注释<br /><br /><br />-- 单行注释，从这到本行结束为注释,类似C++,c#中//<br />/* &#8230; */ 多行注释，类似C++，C#中/* &#8230; */<br /><br /><br /><br /><br /><br />二.变量（int, smallint, tinyint, decimal,float,real, money ,smallmoney, text ,image, char, varchar。。。。。。）<br />语法：<br />DECLARE&nbsp;&nbsp;<br />{<br />{@local_variable data_type}<br />} [,...n]<br />例如：<br /><br /><br />declare @ID int --申明一个名为@ID的变量，类型为int型<br /><br />三.在SQL Server窗口中打印出变量的值<br /><br /><br />语法：<br />PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr<br /><br /><br /><br />四.变量赋值<br /><br /><br />例如：<br /><br />--从数据表中取出第一行数据的ID,赋值给变量@id，然后打印出来<br />Declare @ID int<br />Set @ID = (select top(1) categoryID from categories)<br />Print @ID<br /><br />在SQL中，我们不能像代码那样直接给变量赋值，例如@id = 1，如果要达到这样的功能，可以这样写：<br /><br />Declare @ID int<br />Set @ID = (select 1) -- 类似 @ID=1<br />Select @id=1 -- 类似 @ID=1<br />Print @ID<br /><br /><br />五.变量运算(+,-,*,/,&#8230;&#8230;)<br /><br /><br />以下必要时候省略变量申明<br />Set @ID = (select 1+5) --类似 @ID=1+5<br />Set @ID=(select 1-@ID) --类似 @ID=1-@ID<br /><br />六.比较操作符<br />&#8226; &gt; (greater than).&nbsp;&nbsp;<br />&#8226; &lt; (less than).&nbsp;&nbsp;<br />&#8226; = (equals).&nbsp;&nbsp;<br />&#8226; &lt;= (less than or equal to).&nbsp;&nbsp;<br />&#8226; &gt;= (greater than or equal to).&nbsp;&nbsp;<br />&#8226; != (not equal to).&nbsp;&nbsp;<br />&#8226; &lt;&gt; (not equal to).&nbsp;&nbsp;<br />&#8226; !&lt; (not less than).&nbsp;&nbsp;<br />&#8226; !&gt; (not greater than).&nbsp;&nbsp;<br />没什么说的<br /><br /><br /><br /><br />七.语句块：Begin &#8230; end<br />将多条语句作为一个块，类似与C++，C#中的{ }<br />例如：<br />Begin<br />Set @ID1 = (select 1)<br />Set @ID2 = (select 2)<br />End<br /><br />八.If， if&#8230;else&#8230;<br />语法：<br />IF Boolean_expression<br />{sql_statement | statement_block}<br />[ELSE<br />{sql_statement | statement_block}]<br />例如：<br /><br />If @id is not null<br />Print &#8216;@id is not null<br />if @ID = 1<br />begin<br />Set @ID = (select 1 + 1)<br />end<br />else<br />begin&nbsp;&nbsp;<br />set @ID=(select 1+2)<br />end<br /><br /><br />上面的例子用到了比较操作符，语句块，和IF的语法。<br /><br /><br /><br />九.执行其他存储过程 EXEC<br />例如<br /><br />EXEC dbo.[Sales by Year] @Beginning_Date=&#8217;1/01/90&#8217;, @Ending_Date=&#8217;1/01/08&#8217;<br /><br /><br /><br />十.事务<br /><br />语法：<br /><br /><br />BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable]<br /><br /><br />例如<br /><br />BEGIN TRAN<br />-- 做某些操作，例如Insert into &#8230;<br />if @@error &lt;&gt; 0<br />BEGIN<br />ROLLBACK TRAN<br />END<br />else<br />BEGIN<br />COMMIT TRAN<br />END<br /><br />十一.游标<br /><br />我们可以在存储过程中用Select语句取出每一行数据进行操作，这就需要用到游标。<br /><br /><br />语法：<br />DECLARE cursor_name CURSOR<br />[LOCAL | GLOBAL]<br />[FORWARD_ONLY | SCROLL]<br />[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]<br />[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]<br />[TYPE_WARNING]<br />FOR select_statement<br /><br />[FOR UPDATE [OF column_name [,...n]]]<br /><br /><br /><br /><br />例如：<br /><br />DECLARE @au_id varchar(11), @au_fname varchar(20) &#8211;申明变量<br />--申明一个游标<br />DECLARE authors_cursor CURSOR FOR&nbsp;&nbsp;<br />SELECT au_id, au_fname FROM authors&nbsp;&nbsp;<br />--打开游标<br />OPEN authors_cursor<br />--取出值<br />FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname<br />--循环取出游标的值<br />WHILE @@FETCH_STATUS = 0<br />BEGIN<br />Print @au_id<br />Print @au_fname<br />Print &#8216; &#8217;<br />FETCH NEXT FROM authors_cursor&nbsp;&nbsp;<br />INTO @au_id, @au_fname<br />END<br />CLOSE authors_cursor &#8211;关闭游标<br />DEALLOCATE authors_cursor --释放游标<br />我觉得上面的是存储过程常用的一些东东，如果要更深入的了解，更详细的帮助，请参考SQL Server的帮助文档</span><img src ="http://www.blogjava.net/chen45257211/aggbug/354547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chen45257211/" target="_blank">七孑</a> 2011-07-18 17:35 <a href="http://www.blogjava.net/chen45257211/articles/354547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>