高级Oracle与Java讲解_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4856 | 回复: 0   主题: 高级Oracle与Java讲解        下一篇 
gang
注册用户
等级:上等兵
经验:142
发帖:79
精华:0
注册:2011-12-30
状态:离线
发送短消息息给gang 加好友    发送短消息息给gang 发消息
发表于: IP:您无权察看 2011-12-30 9:50:12 | [全部帖] [楼主帖] 楼主

介绍

     在接下来的部分,我们将讨论两个更加高级的话题:如何从Java上运行PL / SQL代码,相反,如何从PL / SQL上运行Java代码。接下来我们将讲解这两个问题。

Java PL/SQL

     根据下方的概诉考虑为什么和什么时候用Java而不用 PL/SQL.

1.Java对于可复用应用提供了更多的机会(下面讲到的Mod11Ck的c.f.类)

2.与pl/sql程序员相比有更多的Java程序员

3.Java对于无数据库相关的编程任务潜在的更有效率

4.PL / SQL是一个仅由Oracle支持专有的语言。

     通过对比,PL / SQL有以下优点:

    1.PL / SQL与Oracle 的数据库管理系统紧密的整合在一起,因此更容易当作数据库应用去使用

    2.它对于面向数据库的编程任务更加有效。

BLOBs Java

BLOBs:很大的二进制数据块

BLOB的都是非原子的,存储在数据库中的无结构化的二进制数据块。我们将在这部分看到如何使用BLOBs来存储图片----在下一部分将了解Oracle如何使用BLOBs来存储Java类。如下所示,在Oracle中存在BLOB数据类型。

CREATE TABLE pic_store
(
description VARCHAR2(50), picture BLOB


)/创建表pic_store

由于BLOB的性质,他们拥有一个特殊的INSERT过程:首先使用Oracle内置的功能EMPTY_BLOB()创建一个空的BLOB。然后向Oracle服务器建立一个数据流用于上传数据。

使它去工作... ...

在PicDispClasses.jar中的两个类显示图片在Oracle中以BLOB的形式存储。为了避免数据库超载,你将使用相同的pic_store表和scott/tiger1帐户。从JAR文档中提取源代码和类文件并且如下执行程序:

jar xvf PicDispClasses.jar
java PicDisp <picture_description>


通过在 pic_store table2里的一个描述字段的值更换<picture_description>。

一旦代码被运行,确保您已阅读并至少了解PicLoader.java源代码中数据库相关的部分。

Java 存储过程

现在我们将写一个存储过程,使用11模校验码算法(modulo 11 check-digit algorithm)

来验证的ISBN编号。然后将创建一个触发器(称为Postgres规则)去检查无论何时被插入到books表中数据(CF主动数据库的概念)。这个验证过程将只使用数值计算,没有基于数据的处理过程:因此使用Java编写是一个很好的选择。此外, Java类一旦被继承就可在其他相关的数据库和非数据库应用中重复使用。下面的Mod11Ck Java类计算校验码。

public class Mod11Ck {

     public static String calc(String digStr) {

     int len = digStr.length();

     int sum = 0, rem = 0;

     int[] digArr = new int[len];

     for (int k=1; k<=len; k++) // compute weighted sum

     sum += (11 - k) * Character.getNumericValue(digStr.charAt(k - 1));

     if ((rem = sum % 11) == 0) return "0";

     else if (rem == 1) return "X";

else return (new Integer(11 - rem)).toString();

}

}

通过使用下面的命令来编译的上面Java类并加载到Oracle中:

comp-load-j ./Mod11Ck.java

请注意,这不是一个标准的Oracle实用程序,但我写了一个脚本用来从DbObject.conf文件里读取你的Oracle用户名和密码(参见《Introduction to Oracle & Java》),注意DbObject.conf应该放在当前目录下。

你应该能够通过查找数据字典找出Java类是否成功编译(参见《Oracles's Data Dictionary》),类在数据库中将以BLOB的编译格式存储。

下一步我们需要编写一个调用规范来像PL / SQL函数一样发布我们的Java(静态)方法。

CREATE OR REPLACE FUNCTION check_isbn (isbn VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'Mod11Ck.calc(java.lang.String) RETURN java.lang.String';
/


现在,我们可以写一个触发器(在Postgres里的c.f.规则),然后将对图书表上执行的每个INSERT语句验证ISBN编码。如果要插入的最后一个ISBN编码不匹配校验码的计算,一个异常将发生——导致的INSERT语句被回滚。

CREATE OR REPLACE TRIGGER check_isbn_on_ins
BEFORE INSERT ON books
FOR EACH ROW
DECLARE
new_isbn VARCHAR2(10);
BEGIN
new_isbn := TO_CHAR(:NEW.isbn);
IF NOT (LENGTH(new_isbn) = 10 AND
SUBSTR(new_isbn,10,1) = check_isbn(SUBSTR(new_isbn,1,9)))
THEN
RAISE_APPLICATION_ERROR(-20000, 'The ISBN number supplied is invalid!');
END IF;
END;
/


努力去理解触发器的工作机制。

该贴被gang编辑于2011-12-30 9:56:13



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论