介绍
在接下来的部分,我们将讨论两个更加高级的话题:如何从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