<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEE开源研究</title>
    <description>我最喜欢编程，多多交流！</description>
    <link>http://zhanjia.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>基于Spring事务的集成测试</title>
        <author>zhanjia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhanjia.javaeye.com">zhanjia</a>&nbsp;
          链接：<a href="http://zhanjia.javaeye.com/blog/201972" style="color:red;">http://zhanjia.javaeye.com/blog/201972</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">基于<span lang="EN-US">Spring</span>事务的集成测试<span lang="EN-US"></span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">一、</span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">测试类和配置文件的目录结构</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;test</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bbs.spring.common.test</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BaseTransactionalIntegrationTests</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; applicationContext.xml</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bbs.spring.service.test</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopicServiceImplTest</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; applicationContext-test.xml</p>
<p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><span style="font-size: small; font-family: 宋体; mso-bidi-font-size: 10.5pt;"></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">二、</span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">applicationContext.xml</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">配置<span lang="EN-US"></span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">配置数据源、事务和依赖注入，暴露带事务的业务接口。<span lang="EN-US"></span></span></span></p>
<p><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">
<pre name="code" class="xml">......

&lt;!-- hibernateTemplate ..................................................... --&gt;

    &lt;bean id="hibernateTemplate"

        class="org.springframework.orm.hibernate3.HibernateTemplate"&gt;

        &lt;property name="sessionFactory" ref="sessionFactory" /&gt;

    &lt;/bean&gt;

    

 

    &lt;!-- transactionManager .................................................... --&gt;

    &lt;bean id="transactionManager"

        class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;

        &lt;property name="sessionFactory"&gt;

            &lt;ref local="sessionFactory" /&gt;

        &lt;/property&gt;

    &lt;/bean&gt;

 

 

    &lt;!-- 事务代理工厂bean模板 ................................................. --&gt;

    &lt;bean id="baseTransactionProxy" abstract="true"

        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;

        &lt;property name="transactionManager" ref="transactionManager" /&gt;

        &lt;property name="proxyTargetClass" value="true" /&gt;

        &lt;property name="transactionAttributes"&gt;

            &lt;props&gt;

                &lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;

            &lt;/props&gt;

        &lt;/property&gt;

    &lt;/bean&gt;

 

 

    &lt;!-- 实例化Dao .............................................................. --&gt;

    &lt;bean id="topicDao"

        class="org.eesite.bbs.hibernate.dao.TopicDaoImpl"&gt;

        &lt;property name="sessionFactory" ref="sessionFactory" /&gt;

    &lt;/bean&gt;

 

 

    &lt;!-- Transactional proxy for the Application primary business object ..... --&gt;

    &lt;bean id="topicServiceTarget"

        class="org.eesite.bbs.spring.service.TopicServiceImpl"&gt;

        &lt;property name="topicDao" ref="topicDao" /&gt;

    &lt;/bean&gt;

 

 

    &lt;!-- TransactionProxyFactoryBean ........................................... --&gt;

    &lt;bean id="topicService" parent="baseTransactionProxy"&gt;

        &lt;description /&gt;

        &lt;property name="proxyInterfaces"&gt;

            &lt;list&gt;

                &lt;value&gt;

                    org.eesite.bbs.spring.service.ITopicService

                &lt;/value&gt;

            &lt;/list&gt;

        &lt;/property&gt;

        &lt;property name="target"&gt;

            &lt;ref bean="topicServiceTarget" /&gt;

        &lt;/property&gt;

    &lt;/bean&gt;

</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;</p>
<font face="宋体" style="mso-bidi-font-size: 10.5pt;"><font size="3">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</font></font></span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">三、</span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">扩展<span lang="EN-US">Spring</span>抽象事务测试类</span></span></p>
<pre name="code" class="java">
package bbs.spring.common.test;

 

import org.springframework.orm.hibernate3.HibernateTemplate;

import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

 

/**

 * 扩展Spring抽象事务测试类, 注入hibernateTemplate, 实现getConfigLocations方法

 * 

 * @author zhanjia

 * 

 */

public abstract class BaseTransactionalIntegrationTests extends

        AbstractTransactionalDataSourceSpringContextTests {

 

    private HibernateTemplate hibernateTemplate;

 

    /**

     * @return the hibernateTemplate

     */

    public HibernateTemplate getHibernateTemplate() {

        return hibernateTemplate;

    }

 

    /**

     * @param hibernateTemplate

     *            the hibernateTemplate to set

     */

    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

        this.hibernateTemplate = hibernateTemplate;

    }

 

    /*

     * (non-Javadoc)

     * 

     * @see org.springframework.test.AbstractDependencyInjectionSpringContextTests#getConfigLocations()

     */

    @Override

    protected String[] getConfigLocations() {

        setAutowireMode(AUTOWIRE_BY_NAME);

        return new String[] {

                "classpath:bbs/spring/common/test/applicationContext.xml",

                "classpath:bbs/spring/service/test/applicationContext-test.xml" };

    }

 

}
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">四、</span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">applicationContext-test.xml</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">配置<span lang="EN-US"></span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">为测试类注入业务接口和</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New';">hibernateTemplate.</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"></span></span></p>
<p><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;

 

&lt;beans&gt;

    &lt;bean id="topicServiceImplTest"

        class="bbs.spring.service.test.TopicServiceImplTest"&gt;

        &lt;property name="topicService" ref="topicService" /&gt;

        &lt;property name="hibernateTemplate" ref="hibernateTemplate" /&gt;

    &lt;/bean&gt;

&lt;/beans&gt;

</pre>
<font face="宋体" style="mso-bidi-font-size: 10.5pt;"><font size="3">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;</p>
</font></font></span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">五、</span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">测试类</span></span></p>
<pre name="code" class="java">
package bbs.spring.service.test;

 

import java.util.List;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.eesite.bbs.hibernate.vo.Sort;

import org.eesite.bbs.hibernate.vo.Topic;

import org.eesite.bbs.hibernate.vo.User;

import org.eesite.bbs.spring.service.ITopicService;

 

import bbs.spring.common.test.BaseTransactionalIntegrationTests;

 

/**

 * 主题测试类

 * 

 * @author zhanjia

 * 

 */

public class TopicServiceImplTest extends BaseTransactionalIntegrationTests {

 

    private static final Log log = LogFactory

            .getLog(TopicServiceImplTest.class);

 

    private ITopicService topicService;

 

    /**

     * @return the topicService

     */

    public ITopicService getTopicService() {

        return topicService;

    }

 

    /**

     * @param topicService

     *            the topicService to set

     */

    public void setTopicService(ITopicService topicService) {

        this.topicService = topicService;

    }

 

    public void testInsertTopic() {

        this.deleteFromTables(new String[] { "Topic", "Sort", "User" });

        // this.jdbcTemplate.execute("INSERT INTO ...");

 

        Sort sort = new Sort();

        sort.setId(new Long(1));

        sort.setSortName("分类1");

        sort.setDescription("");

 

        User user = new User();

        user.setId(new Long(1));

        user.setUserName("zhanjia");

 

        Topic topic = new Topic();

        topic.setId(new Long(1));

        topic.setTopicName("标题名");

        topic.setContent("");

        topic.setIcon("");

        topic.setSort(sort);

        topic.setUser(user);

 

        this.getTopicService().insertTopic(topic);

        

        List list = this.getHibernateTemplate().find("from Topic");

        assertEquals(1, list.size());

        

        Long count = this.jdbcTemplate.queryForLong("select count(*) from Topic");

        assertEquals(1, count.intValue());

    }

}
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;"><span style="font-size: small;">&nbsp;</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://zhanjia.javaeye.com/blog/201972#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jun 2008 00:54:03 +0800</pubDate>
        <link>http://zhanjia.javaeye.com/blog/201972</link>
        <guid>http://zhanjia.javaeye.com/blog/201972</guid>
      </item>
      <item>
        <title>HttpInvoker远程调用实例</title>
        <author>zhanjia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhanjia.javaeye.com">zhanjia</a>&nbsp;
          链接：<a href="http://zhanjia.javaeye.com/blog/201058" style="color:red;">http://zhanjia.javaeye.com/blog/201058</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">一、服务器端：<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">1</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、服务接口与实现类<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<pre name="code" class="java">package org.eesite.bbs.remote;

/**

 * 远程服务接口

 * 

 * @author zhanjia

 * 

 */

public interface IRemoteService {

    public String getString(String msg);

}

 

package org.eesite.bbs.remote;

/**

 * 远程服务接口实现类

 * 

 * @author zhanjia

 * 

 */

public class RemoteServiceImpl implements IRemoteService {

    public String getString(String msg) {

       String str = "正在请求调用...远程服务调用成功! " + msg;

       return str;

    }

}
</pre>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;">&nbsp;&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">2</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、服务暴露配置<span lang="EN-US">remote-servlet.xml</span></span></strong></p>
<p><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;

&lt;beans&gt;

    &lt;!-- 通过Spring HttpInvoker机制暴露远程访问服务 --&gt;

    &lt;bean id="rmiService"

       class="org.eesite.bbs.remote.RemoteServiceImpl" /&gt;

 

    &lt;bean name="/remoteService"

class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"&gt;

       &lt;property name="service" ref="rmiService" /&gt;

       &lt;property name="serviceInterface"

           value="org.eesite.bbs.remote.IRemoteService" /&gt;

    &lt;/bean&gt;

&lt;/beans&gt;

</pre>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">3</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、<span lang="EN-US">web.xml</span>配置<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<pre name="code" class="xml">&lt;!-- 加载服务配置文件 --&gt;

&lt;context-param&gt;

       &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;

       &lt;param-value&gt;/WEB-INF/remote-servlet.xml&lt;/param-value&gt;

    &lt;/context-param&gt;

 

&lt;!-- 配置DispatcherServlet --&gt;

    &lt;servlet&gt;

        &lt;servlet-name&gt;remote&lt;/servlet-name&gt;

        &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;

        &lt;!-- 配置该Servlet随应用启动时候启动 --&gt;

        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;

    &lt;/servlet&gt;

&lt;!-- 配置DispatcherServlet映射的url --&gt;

    &lt;servlet-mapping&gt;

       &lt;servlet-name&gt;remote&lt;/servlet-name&gt;

       &lt;url-pattern&gt;/remoting/*&lt;/url-pattern&gt;

    &lt;/servlet-mapping&gt;
</pre>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;">&nbsp;&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">注意：<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">注册<span lang="EN-US">servlet</span>名为<span lang="EN-US">remote</span>，此名字要和服务配置文件的名字的第一部分相同，即<span lang="EN-US">servlet</span>的名字必须为<span lang="EN-US">remote-servlet</span>中的<span lang="EN-US">remote</span>。<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">二、客户端<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">1</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、配置文件<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&lt;!-- </span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">通过<span lang="EN-US">Spring HttpInvoker</span>机制代理远程访问服务<span lang="EN-US"> --&gt;</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span>&lt;bean id="remoteService"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span>class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property name="serviceUrl"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="http://localhost:2601/EEweb/remoting/remoteService" /&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property name="serviceInterface"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="org.eesite.bbs.remote.IRemoteService" /&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span>&lt;/bean&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">其中<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">1)</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">IRemoteService</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">只要有与服务端接口的方法一样就可以调用，此处的包名和类名可以根据实际情况给出，不过一般建议和服务器端的接口/类名一样，这样更合理些。<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">2)</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">EEweb</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">为服务端应用名称，<span lang="EN-US">remoting</span>为<span lang="EN-US">web.xml</span>中<span lang="EN-US">servlet</span>过滤<span lang="EN-US">url</span>的<span lang="EN-US">/remoting/*</span>中的<span lang="EN-US">remoting</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">2</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">、测试类<span lang="EN-US"></span></span></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-weight: bold;">package</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"> test;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-weight: bold;">import</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"> org.eesite.bbs.remote.IRemoteService;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-weight: bold;">import</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"> org.springframework.context.ApplicationContext;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-weight: bold;">import</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"> org.springframework.context.support.ClassPathXmlApplicationContext;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">/**</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;</span>* <span style="mso-bidi-font-weight: bold;">@author</span> zhanjia</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;</span>* </span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;</span>*/</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-weight: bold;">public</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"> <span style="mso-bidi-font-weight: bold;">class</span> TestRemote {</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span>/**</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;</span>* <span style="mso-bidi-font-weight: bold;">@param</span> args</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;</span>*/</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="mso-bidi-font-weight: bold;">public</span> <span style="mso-bidi-font-weight: bold;">static</span> <span style="mso-bidi-font-weight: bold;">void</span> main(String[] args) {</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ApplicationContext applicationContext = <span style="mso-bidi-font-weight: bold;">new</span> ClassPathXmlApplicationContext(</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">"remote.xml");</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IRemoteService service = (IRemoteService) applicationContext</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 4;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>.getBean("remoteService");</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String msg = service.getString("</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">哈哈，我来了<span lang="EN-US">!");</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.<em>out</em>.println(msg);</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">测试结果：</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">正在请求调用<span lang="EN-US">...</span>远程服务调用成功<span lang="EN-US">! </span>哈哈，我来了<span lang="EN-US">!</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt;"><span lang="EN-US"></span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://zhanjia.javaeye.com/blog/201058#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 21:48:19 +0800</pubDate>
        <link>http://zhanjia.javaeye.com/blog/201058</link>
        <guid>http://zhanjia.javaeye.com/blog/201058</guid>
      </item>
      <item>
        <title>Oracle的过程与函数</title>
        <author>zhanjia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhanjia.javaeye.com">zhanjia</a>&nbsp;
          链接：<a href="http://zhanjia.javaeye.com/blog/197267" style="color:red;">http://zhanjia.javaeye.com/blog/197267</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <!--  [if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-align: center;"><span style="font-size: medium;"><strong><span lang="EN-US">Oracle</span>
<span style="font-family: 宋体;">的过程与函数</span>
</strong>
</span>
</p>
<p class="MsoNormal" style="text-align: center;">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">一、<strong>过程</strong>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<strong>1</strong>
</span>
<strong><span style="font-family: 宋体;">、过程创建和调用</span>
</strong>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">过程</span>
<span lang="EN-US">(procedure)</span>
<span style="font-family: 宋体;">是一个</span>
<span lang="EN-US">PL/SQL</span>
<span style="font-family: 宋体;">语句块，它存储在数据字典中并可被应用程序调用。可以使用过程存储数据库中频繁使用的应用逻辑。当执行一个过程时，其语句被作为一个整体执行。过程不将任何值返回调用程序。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">使用存储过程的一个好处就是能够实施数据的安全性。可以使不授权用户直接访问应用程序中的一些表，而授权用户执行访问这些表的一个过程。当执行过程时，他将以过程拥有者的权限来执行。除非通过过程，否则用户就不能访问这些表。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span style="font-family: 宋体;">创建过程语句的语法如下</span>
</strong>
<span style="font-family: 宋体;">：</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
CREATE
[OR REPLACE] PROCEDURE </span>
<span style="font-family: 宋体;">过程名称</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
[(</span>
<span style="font-family: 宋体;">参数</span>
<span lang="EN-US">[{IN | OUT | IN OUT}] </span>
<span style="font-family: 宋体;">类型，</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
&hellip;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">参数</span>
<span lang="EN-US">[{IN | OUT | IN OUT}] </span>
<span style="font-family: 宋体;">类型</span>
<span lang="EN-US"> )]</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
[AUTHID
{CURRENT_USER | DESIGNER}]</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
{IS
| AS}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">过程体</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">在</span>
<span lang="EN-US">CREATE</span>
<span style="font-family: 宋体;">关键字后加上</span>
<span lang="EN-US">OR REPLACE</span>
<span style="font-family: 宋体;">关键字是为了允许将撤销和重建这两步操作合并为一个操作。因为在创建一个过程时，有可能这个过程已存在。为了修改过程的代码，首先必须将该过程撤销，然后再重建。由于这种操作已经是开发过程的标准方式，所以关键字</span>
<span lang="EN-US">OR REPLACE</span>
<span style="font-family: 宋体;">允许将撤销和重建这两步操作合并为一个操作。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">和其他的</span>
<span lang="EN-US">CREATE</span>
<span style="font-family: 宋体;">语句一样，创建过程是一种</span>
<span lang="EN-US">DDL</span>
<span style="font-family: 宋体;">操作。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">在过程和函数中没有使用关键字</span>
<span lang="EN-US">DECLARE</span>
<span style="font-family: 宋体;">，取而代之的是关键字</span>
<span lang="EN-US">IS</span>
<span style="font-family: 宋体;">或</span>
<span lang="EN-US">AS</span>
<span style="font-family: 宋体;">。这种语法风格是</span>
<span lang="EN-US">PL/SQL</span>
<span style="font-family: 宋体;">从</span>
<span lang="EN-US">Ada</span>
<span style="font-family: 宋体;">语言中继承下来的。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">综上所述，过程的结构应具有下面所示的特征</span>
</strong>
<span style="font-family: 宋体;">：</span>
</p>
<p class="MsoNormal"><span lang="EN-US">CREATE OR REPLACE PROCEDURE </span>
<span style="font-family: 宋体;">过程名称</span>
<span lang="EN-US">[ </span>
<span style="font-family: 宋体;">参数列</span>
<span lang="EN-US"> ] AS</span>
</p>
<p class="MsoNormal"><span lang="EN-US">/* </span>
<span style="font-family: 宋体;">声明部分在这里</span>
<span lang="EN-US"> */</span>
</p>
<p class="MsoNormal"><span lang="EN-US">BEGIN</span>
</p>
<p class="MsoNormal"><span lang="EN-US">/* </span>
<span style="font-family: 宋体;">可执行部分在这里</span>
<span lang="EN-US"> */</span>
</p>
<p class="MsoNormal"><span lang="EN-US">EXCEPTION</span>
</p>
<p class="MsoNormal"><span lang="EN-US">/* </span>
<span style="font-family: 宋体;">异常部分在这里</span>
<span lang="EN-US"> */</span>
</p>
<p class="MsoNormal"><span lang="EN-US">END [</span>
<span style="font-family: 宋体;">过程名称</span>
<span lang="EN-US">];</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">过程名可以写在过程声明中最后一个</span>
<span lang="EN-US">END</span>
<span style="font-family: 宋体;">语句之后。如果在该</span>
<span lang="EN-US">END</span>
<span style="font-family: 宋体;">语句之后有标识符，该标识符一定要与该过程名匹配。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">下面给出一个创建过程的简单例子，用于打印当前时间</span>
</strong>
<span style="font-family: 宋体;">。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">CREATE OR REPLACE PROCEDURE
print_current_time AS</span>
</p>
<p class="MsoNormal"><span lang="EN-US">CURTIME VARCHAR2(20);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">BEGIN</span>
</p>
<p class="MsoNormal"><span lang="EN-US">SELECT TO_CHAR(sysdate, &lsquo;yyyy/mm/dd
hh24:mi:ss&rsquo;)</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
INTO
CURTIME</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
FROM
dual;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">DBMS_OUTPUT.put_line(&lsquo;</span>
<span style="font-family: 宋体;">当前时间</span>
<span lang="EN-US">: &rsquo;||CHR(9)||CURTIME);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">END print_current_time;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">/</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">在</span>
<span lang="EN-US">PL/SQL</span>
</strong>
<strong><span style="font-family: 宋体;">中，调用过程有以下两种方式</span>
</strong>
<span style="font-family: 宋体;">。</span>
</p>
<p class="MsoNormal"><strong><span lang="EN-US">*</span>
</strong>
<span lang="EN-US"> </span>
<span style="font-family: 宋体;">直接利用</span>
<span lang="EN-US">EXECUTE</span>
<span style="font-family: 宋体;">命令</span>
</p>
<p class="MsoNormal"><span lang="EN-US">EXECUTE print_current_time;</span>
</p>
<p class="MsoNormal"><strong><span lang="EN-US">*</span>
</strong>
<span lang="EN-US"> </span>
<span style="font-family: 宋体;">在</span>
<span lang="EN-US">PL/SQL</span>
<span style="font-family: 宋体;">块中调用</span>
<span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: black;"><br />
</span>
<span lang="EN-US">declare <br />
begin<br />
<span>&nbsp; </span>
print_current_time;<br />
end;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<strong>2</strong>
</span>
<strong><span style="font-family: 宋体;">、过程参数设置与传递</span>

</strong>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">下面是一个带参数过程的简单例子。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
CREATE
OR REPLACE PROCEDURE print_parameter</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
(param1
IN VARCHAR2 DEFAULT NULL) AS</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
BEGIN</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
IF
(param1 IS NULL) THEN</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
DBMS_OUTPUT.put_line(&lsquo;</span>
<span style="font-family: 宋体;">你没输入参数</span>
<span lang="EN-US">&rsquo;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ELSE</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
DBMS_OUTPUT.put_line(&lsquo;</span>
<span style="font-family: 宋体;">你输入的参数是：</span>
<span lang="EN-US">&rsquo;||CHR(9)||param1);</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
END
IF;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
END
print_parameter;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span style="font-family: 宋体;">形参可以有</span>
<span lang="EN-US">3</span>
</strong>
<strong><span style="font-family: 宋体;">种模式</span>
</strong>
<span style="font-family: 宋体;">：</span>
<span lang="EN-US">IN</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">OUT</span>
<span style="font-family: 宋体;">或</span>
<span lang="EN-US">IN OUT</span>
<span style="font-family: 宋体;">。如果没有为形参指定模式，其默认模式为</span>
<span lang="EN-US">IN</span>
<span style="font-family: 宋体;">。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
IN</span>
<span style="font-family: 宋体;">：该值具有只读属性，不能对其修改。当该过程结束时，控制将返回到调用环境，这时，对应的实参没有改变。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
OUT</span>
<span style="font-family: 宋体;">：该变量具有读写属性。当该过程结束时，控制将返回调用环境，形参的内容将被赋予对应的实参。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
IN
OUT</span>
<span style="font-family: 宋体;">：该模式是模式</span>
<span lang="EN-US">IN</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">OUT</span>
<span style="font-family: 宋体;">的组合。调用过程时，实参的值将被传递到该过程中。在过程内部，形参相当于初始化的变量，并具有读写属性。当该过程结束时，控制将返回调用环境中，形参的内容将被赋予实参。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">在过程的声明中，不能强制指定参数</span>
<span lang="EN-US">CHAR</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">VARCHAR2</span>
<span style="font-family: 宋体;">的长度，以及指定</span>
<span lang="EN-US">NUMBER</span>
<span style="font-family: 宋体;">参数的精度或小数点后倍数。这样是非法的，因为这些限制可以从实参中获得。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
PL/SQL</span>
<span style="font-family: 宋体;">的默认方式是对参数</span>
<span lang="EN-US">IN</span>
<span style="font-family: 宋体;">执行按引用传递，而对参数</span>
<span lang="EN-US">OUT</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">IN OUT</span>
<span style="font-family: 宋体;">执行按值传递。另外，使用</span>
<span lang="EN-US">NOCOPY</span>
<span style="font-family: 宋体;">编译器将按引用传递参数，而不是按值传递。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">二、<strong>函数的创建、查询和调用</strong>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">与过程一样，函数也带有参数，是存储在数据库中的代码块。其差别在于函数可以把值返回调用程序，可以在</span>
<span lang="EN-US">SQL</span>
<span style="font-family: 宋体;">语句中调用它们。一般的调用方式是：过程调用本身是一个</span>
<span lang="EN-US">PL/SQL</span>
<span style="font-family: 宋体;">语句，而函数调用是作为表达式的一部分执行的。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">语法如下：</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
CREATE
[OR REPLACE] FUNCTION </span>
<span style="font-family: 宋体;">函数名称</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
[(</span>
<span style="font-family: 宋体;">参数</span>
<span lang="EN-US">[{IN | OUT | IN OUT}] </span>
<span style="font-family: 宋体;">数据类型，</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
&hellip;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">参数</span>
<span lang="EN-US">[{IN | OUT | IN OUT}] </span>
<span style="font-family: 宋体;">数据类型</span>
<span lang="EN-US"> )]</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
[AUTHID
{CURRENT_USER | DESIGNER}]</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
{IS
| AS}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">函数体</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">返回语句：</span>
<span lang="EN-US">RETURN </span>
<span style="font-family: 宋体;">返回值</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">当执行该语句时，如果表达式的类型与定义不符，该表达式将被转换为函数定义子句</span>
<span lang="EN-US">RETURN</span>
<span style="font-family: 宋体;">中指定的类型。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">创建一个函数，确定一个数是奇数还是偶数。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
CREATE
OR REPLACE FUNCTION EVEN_ODD</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
(p_Number
IN NUMBER) </span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
RETURN
VARCHAR2 IS </span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
RETVAL
VARCHAR2(5);</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
BEGIN</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
IF
(p_Number MOD 2) = 0 THEN</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
RETVAL:=&rsquo;EVEN&rsquo;;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
ELSE</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
RETVAL:=&rsquo;ODD&rsquo;;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
END
IF;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
RETURN
RETVAL;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
END
EVEN_ODD;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
/</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">可以用</span>
<span lang="EN-US">SELECT</span>
<span style="font-family: 宋体;">语句进行查询：</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
SELECT
EVEN_ODD(29) FROM DUAL;</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">对函数的调用一般在作为表达式的那部分进行，如：</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
DBMS_OUTPUT.put_line(EVEN_ODD(a_number));</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">三、<strong>删除过程和函数</strong>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
DROP
PROCEDURE </span>
<span style="font-family: 宋体;">过程名称；</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
DROP
FUNCTION </span>
<span style="font-family: 宋体;">函数名称；</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://zhanjia.javaeye.com/blog/197267#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 01:44:28 +0800</pubDate>
        <link>http://zhanjia.javaeye.com/blog/197267</link>
        <guid>http://zhanjia.javaeye.com/blog/197267</guid>
      </item>
      <item>
        <title>测试驱动新书pdf - PracticalTDD and Acceptance TDD for Java...</title>
        <author>zhanjia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhanjia.javaeye.com">zhanjia</a>&nbsp;
          链接：<a href="http://zhanjia.javaeye.com/blog/131704" style="color:red;">http://zhanjia.javaeye.com/blog/131704</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">《Test Driven --PracticalTDD and Acceptance TDD for Java Developers》</font></p>
<p>值得一看的一本新书，希望对大家有所帮助</p>
<p>网址：<a href="http://www.manning.com/koskela/" class="msgbody" target="_blank">http://www.manning.com/koskela/</a> </p>
<p>文件大小：8.57MB，想要的请联系我。<font face="Arial">邮箱: zhanjia21@163.com</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://zhanjia.javaeye.com/blog/131704#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 13 Oct 2007 20:03:41 +0800</pubDate>
        <link>http://zhanjia.javaeye.com/blog/131704</link>
        <guid>http://zhanjia.javaeye.com/blog/131704</guid>
      </item>
  </channel>
</rss>