⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 13.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
END;</FONT></PRE>
                        <P>在Oracle <I>8i 
                        </I>里,这四种存储程序类型的每一种,都可以从不同的调用环境调用,这些调用环境是:</P>
                        <P><I>SQL语句</I><B>——</B>可以在任何SQL语句内部调用函数。</P>
                        <P><I>顶级CALL语法</I><B>——</B>使用CALL语句,可以在顶级调用过程和函数。CALL是随Oracle<I>8</I>i新引进的语法。</P>
                        <P><I>PL/SQL块、子程序、包</I><B>——</B>可以在PL/SQL子程序、包或匿名块里调用它们。请注意:Java存储程序自己可以在匿名的BEGIN 
                        … END 块内被调用。</P>
                        <P><I>触发器的隐式调用</I>——最后,PL/SQL或Java存储过程可以在触发器执行的时候,隐式地被调用。</P>
                        <H2 class=b2a><FONT 
                        size=+1>把JAVA与现存的PL/SQL程序结合</FONT></H2>
                        <P>要想理解如何才能把Java 
                        应用程序和现有的PL/SQL存储过程结合起来,我们首先要理解开发Java存储过程的三个步骤:</P>
                        <P><B>第一步:编写Java 
                        存储过程:</B>第一步是编写要做成存储过程的Java程序。可以用标准的Java编写,也可以用SQLJ编写—因为存储过程通常都是SQL密集型的,所以用SQLJ编写存储过程,是一个效率较高的方法。</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>public class Foo {
    public static String prependHello(String tail) {
        return "Hello " + tail;}}</FONT></PRE>
                        <P><B>第二步:步署、发布存储过程:</B>用Java开发工具编写完Java程序后,要把它装载进Oracle<I>8</I>i。要用Oracle提供的loadjava命令行工具,以源文件、二进制文件、.class类文件、Java 
                        .jar归档文件的形式,把Java程序装载进Oracle<I>8i</I>中的目标数据库大纲。Loadjava是一个Java程序,它用Oracle的JDBC驱动程序连接服务器,自动把一组Java程序装载进服务器。(还可以使用CREATE 
                        JAVA这个工具,它是SQL*Plus的SQLDDL命令)</P><PRE align="left">    <B><FONT face="Courier New, Courier, mono" size=2>&gt;loadjava -user scott/tiger@oudelsrv-1:5521:ORCL Foo.class</FONT></B></PRE>
                        <P>命令执行之后,会把类foo的方法装入scott的大纲(请参阅第后面有关Java、SQL和PL/SQL名称的内容,了解命名空间解析的问题)。下一步是,把方法登记到SQL上。这一步为什么是必不可少的呢?如果只用PL/SQL,就没有必要显式地把PL/SQL过程登记到SQL上—对SQL来说,每个PL/SQL过程自动就是可见的。反之,在使用Java的时候,所有的Java方法对SQL来说都是不可见的—要让一个Java方法能够作为存储过程,在SQL里调用它,就必须显式地把它“发布”到SQL当中。Java 
                        类和方法不会自动地发布到数据字典、SQL和PL/SQL里,原因有二:</P>
                        <BLOCKQUOTE>
                          <OL>
                            <LI>Java应用程序里的大多数方法,通常是由其它Java程序调用;而且Java到Java的调用,发生在Java虚拟机环境里,没有必要暴露给SQL。 

                            <LI>SQL编译器需要有关SQL数据类型到Java数据类型如何映射参数的指导,还需要正确重载调用的信息,以便给出与原始实际参数值对应的SQL数据类型。这需要开发人员的干预,所以只有某些顶级Java方法需要在SQL和PL/SQL里调用。 
                            </LI></OL></BLOCKQUOTE>
                        <H3 class=b2a><FONT 
                        size=3>如何把Java方法发布到SQL和PL/SQL?</FONT></H3>
                        <P>要把Java程序发布到SQL,只需把顶级的Java入口点暴露给SQL,让SQL能够调用它就可以了。这是什么意思呢?我们来看看一个Java实现的数据库触发器:Java触发器可能有多个类和方法调用。但是,在DML语句执行时,只会调用这些方法中的一个,作为初始调用。之后,Java到Java的调用,就完全是在Java虚拟机内进行的。所以,把Java发布到SQL时,只需把顶级的Java入口点(SQL初始调用的Java类或方法),登记到SQL里就可以了。</P>
                        <P>要把Java 方法发布到SQL,需要声明一个“调用规范”。方法是:用CREATE 
                        PROCEDURE语句声明一个过程或函数,并给它定义一个SQL名称,给参数定义与SQL兼容的名称,以及参数和返回类型对应的SQL类型。</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>&gt;CREATE FUNCTION PREPENDHELLO (s VARCHAR2) RETURN VARCHAR2 AS
    LANGUAGE JAVA NAME 'Foo.prependHello(java.lang.String)
      return java.lang.String';</FONT></PRE>
                        <P>使用这种技术,只有静态的Java方法,才能从SQL进行调用。</P>
                        <P>从SQL调用Java的另一个方法是使用实例方法。它包括:建立Oracle Objects &#8482; 
                        对象,用Java方法实现对象的方法。这个技术使用CREATE TYPE 
                        BODY命令,提供给数据库的信息与CREATE PROCEDURE命令的信息类似:</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>create or replace type &nbsp;body point is
    member function jdistance (p point) return number is
    language java name
      'Point4.distance (Point4) return double';</FONT></PRE>
                        <P align=left><B>第三步:从</B><B>SQL</B><B>或</B><B> 
                        PL/SQL</B><B>调用</B><B>Java</B><B>:</B>存储过程发布之后,它就象一个PL/SQL存储过程一样。可以用在调用规范里指定的SQL名称,在各种环境里调用它:</P>
                        <P>可以在任何SQL语句内部调用:</P><PRE align="left"><FONT face="Courier New, Courier, mono" size=2><B>  &gt;SELECT prepend_hello(ENAME) FROM EMP;</B></FONT></PRE>
                        <P>使用CALL格式在顶级调用:</P><PRE align="left"><FONT face="Courier New, Courier, mono" size=2><B>  &gt;CALL prepend_hello(‘BILL’) INTO :x;\</B></FONT></PRE>
                        <P>在PL/SQL过程、包或匿名块的内部,使用与调用其它PL/SQL过程一样的语法调用:</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>&gt;DECLARE
emp_name VARCHAR;
BEGIN…
  emp_name := prepend_hello(‘BILL’);
END;</FONT></PRE>
                        <P>从一个实例的方法内部,可以调用Oracle对象的方法,从而调用底层的Java实现:</P><PRE align="left"><FONT face="Courier New, Courier, mono" size=2>  select pt.p, pt.p.jdistance(point(0, 0)) from point_table pt;</FONT></PRE>
                        <P>最后,既然所有发布的Java子程序,对SQL和PL/SQL来说,都仿佛是一个PL/SQL子程序[内部用Java实现的子程序],那么一个Java子程序就能透明地参与到PL/SQL子程序所发起的服务器到服务器的RPC调用当中,也能参与到远程数据库服务器的SQL发出的分布式事务当中。</P>
                        <H3 class=b2a><FONT size=3>Java 程序如何访问SQL和PL/SQL? 
                        </FONT></H3>
                        <P>Java 应用程序使用标准的JDBC语法或SQLJ语法访问SQL和PL/SQL。Oracle<I>8i 
                        </I>提供了内嵌的JDBC驱动程序和内嵌的SQLJ 
                        转换器,它们都提供了与Oracle客户端JDBC驱动程序及SQLJ转换器相同的功能,其中包括对所有Oracle专有数据类型的支持(例如ROWID、REFCursors、及Oracle8对象关系类型)。例如,有这样一个用PL/SQL编写的存储函数prepend_hello。要通过JDBC在Java程序里调用这个存储过程,我们使用下面的标准JDBC语法:</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>public class StaticCurJDBC {
  public static String get() throwsSQLException,
  CoreException {
  DriverManager.registerDriver(new OracleDriver());
  Connection con=DriverManager.getConnection("jdbc:oracle:kprb:");
  Statement stmt = con.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT prepend_hello(ENAME) FROM EMP);
}</FONT>
</PRE>
                        <P><BR>用SQLJ调用PL/SQL函数的示例如下:</P><PRE align="left"><FONT color=#000066 face="Courier New, Courier, mono" size=2>public class StaticCurJDBC {
public static String get() throwsSQLException,
CoreException {
String p_name;
#SQL{SELECT prepend_hello(ENAME) INTO :p_name FROM EMP WHERE empno = :id};
}</FONT></PRE>
                        <P>请注意这个SQLJ程序:对于Java 存储过程 
                        (例如:在数据库中运行的存储过程),不需要设置连接信息,因为SQLJ转换器会自动得到这个信息。</P>
                        <H2 class=b2a><FONT size=+1>JAVA,SQL, 
                        和PL/SQL名称</FONT></H2>
                        <P>完全规范SQL名称或PL/SQL名称,标识着同指定大纲有关的大纲对象。例如,名称scott.getname 
                        代表在大纲scott里的PL/SQL存储过程。</P>
                        <P>因为SQL名称是相对于大纲而言的,所以在不同的大纲里,可以使用相同的函数名称。Java中的名称,由解析器规范机制解析,这个机制给出一个排好序的Java名称列表,Oracle的大纲会在列表中进行查找。与Java和PL/SQL有关的命名空间,在数据库里被分隔开。对于已经有PL/SQL存储过程的客户,或者准备用Java和PL/SQL共同编写存储过程的用户来说,这个考虑非常重要。因为数据库把这些命名空间分隔开来,所以用户可以拥有名称相同的存储过程,一个用Java实现,另一个用PL/SQL实现。因为Java存储过程的调用描述器或“调用规范”具有SQL名称,所以标准SQL重载机制会象处理PL/SQL存储过程一样来处理Java存储过程。</P><!-- end of storybody --></SPAN>
        </td>
      </tr>
      </td>
  </tr>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -