如何把Java方法发布到SQL和PL/SQL?
要把Java程序发布到SQL,只需把顶级的Java入口点暴露给SQL,让SQL能够调用它就可以了。这是什么意思呢?我们来看看一个Java实现的数据库触发器:Java触发器可能有多个类和方法调用。但是,在DML语句执行时,只会调用这些方法中的一个,作为初始调用。之后,Java到Java的调用,就完全是在Java虚拟机内进行的。所以,把Java发布到SQL时,只需把顶级的Java入口点(SQL初始调用的Java类或方法),登记到SQL里就可以了。
要把Java 方法发布到SQL,需要声明一个“调用规范”。方法是:用create PROCEDURE语句声明一个过程或函数,并给它定义一个SQL名称,给参数定义与SQL兼容的名称,以及参数和返回类型对应的SQL类型。
>create FUNCTION PREPENDHELLO (s VARchar2) RETURN VARchar2 AS LANGUAGE JAVA NAME ´Foo.prependHello(java.lang.String) return java.lang.String´; |
使用这种技术,只有静态的Java方法,才能从SQL进行调用。从SQL调用Java的另一个方法是使用实例方法。它包括:建立Oracle Objects对象,用Java方法实现对象的方法。这个技术使用create TYPE BODY命令,提供给数据库的信息与create PROCEDURE命令的信息类似:
create or replace type body point is member function jdistance (p point) return number is language java name ´Point4.distance (Point4) return double´; |
第三步:从SQL或 PL/SQL调用Java:存储过程发布之后,它就象一个PL/SQL存储过程一样。可以用在调用规范里指定的SQL名称,在各种环境里调用它:
可以在任何SQL语句内部调用:
>select prepend_hello(ENAME) FROM EMP; |
使用CALL格式在顶级调用:
>CALL prepend_hello(‘BILL’) INTO :x; |
在PL/SQL过程、包或匿名块的内部,使用与调用其它PL/SQL过程一样的语法调用:
>DECLARE emp_name VARchar; BEGIN… emp_name := prepend_hello(‘BILL’); … END; |
从一个实例的方法内部,可以调用Oracle对象的方法,从而调用底层的Java实现:
select pt.p, pt.p.jdistance(point(0, 0)) from point_table pt; |
最后,既然所有发布的Java子程序,对SQL和PL/SQL来说,都仿佛是一个PL/SQL子程序[内部用Java实现的子程序],那么一个Java子程序就能透明地参与到PL/SQL子程序所发起的服务器到服务器的RPC调用当中,也能参与到远程数据库服务器的SQL发出的分布式事务当中。
Java 程序如何访问SQL和PL/SQL?
Java 应用程序使用标准的JDBC语法或SQLJ语法访问SQL和PL/SQL。Oracle8i 提供了内嵌的JDBC驱动程序和内嵌的SQLJ 转换器,它们都提供了与Oracle客户端JDBC驱动程序及SQLJ转换器相同的功能,其中包括对所有Oracle专有数据类型的支持(例如ROWID、REFCursors、及Oracle8对象关系类型)。例如,有这样一个用PL/SQL编写的存储函数prepend_hello。要通过JDBC在Java程序里调用这个存储过程,我们使用下面的标准JDBC语法:
} |
用SQLJ调用PL/SQL函数的示例如下:
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}; … } |
请注意这个SQLJ程序:对于Java 存储过程 (例如:在数据库中运行的存储过程),不需要设置连接信息,因为SQLJ转换器会自动得到这个信息。
JAVA,SQL, 和PL/SQL名称
完全规范SQL名称或PL/SQL名称,标识着同指定大纲有关的大纲对象。例如,名称scott.getname 代表在大纲scott里的PL/SQL存储过程。
因为SQL名称是相对于大纲而言的,所以在不同的大纲里,可以使用相同的函数名称。Java中的名称,由解析器规范机制解析,这个机制给出一个排好序的Java名称列表,Oracle的大纲会在列表中进行查找。与Java和PL/SQL有关的命名空间,在数据库里被分隔开。
对于已经有PL/SQL存储过程的客户,或者准备用Java和PL/SQL共同编写存储过程的用户来说,这个考虑非常重要。因为数据库把这些命名空间分隔开来,所以用户可以拥有名称相同的存储过程,一个用Java实现,另一个用PL/SQL实现。因为Java存储过程的调用描述器或“调用规范”具有SQL名称,所以标准SQL重载机制会象处理PL/SQL存储过程一样来处理Java存储过程。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
甲骨文公布“2015 Duke选择奖”获奖名单
在10月27日晚上JavaOne大会的颁奖典礼上,甲骨文宣布了“2015 Duke选择奖”获奖名单。
-
Java开发者编写SQL语句时常见的10种错误
Java开发者对于面向对象编程思维与命令行编程思维的协调程度,取决于他们如下几种能力的水平.
-
2015年“甲骨文杯”全国Java程序设计大赛即将拉开帷幕
Java至今已经走过了充满荣耀的20年。凭借其卓越的通用性、高效性、平台移植性和安全性,Java语言拥有全球最广泛的开发者用户,可谓是编程语言界的常青藤
-
甲骨文推出新版Oracle Java ME Embedded
为了帮助客户满足这些需求,Java平台微型版(Java ME)为市场领先的嵌入式芯片架构提供了全面支持,为基于ARM架构的开发电路板提供了新的二进制代码。