为什么80%的码农都做不了架构师?>>>
在实际的项目中,有部分业务逻辑很灵活,我们很希望可以在实施的时候由实施人员写一段小的脚本来完成。
最好的方法就是我们将脚本放到数据库中去执行,如下介绍了一种可以在Oracle中执行javascript的方法,在项目中运行一周后,效果不错。
1. 环境: Oracle 11g windows 2003 R2 jdk1.5 (oracle 11g 自带)
2. 使用的包: rhino 1.7 , schu.js (要执行的脚本)
3. 说明: rhino其中有js-14.jar 和 js.jar, 前者用以 jre1.4 及以前版本的,后者用以jre1.5及以后版本的;由于oracle 10g 自带的是jdk1.4,所以如果您使用了oracle 10g 请导入js-14.jar。(注:经本人测试后发现oracle 10g 导入js-14.jar 时会出现很多的错误,致使最后无法使用java,所以请不要再浪费时间在其上了。)
4. 步骤:
1) 在命令行下执行:loadjava -r -f -verbose -resolve -user user/password js.jar
在导入的过程中会出现错误,那是由于mozilla提供的javascript 实现的版本很高,支持xml的,错误和此有关,由于我们用不到,忽略就行了。
2) 使用toad 或者 oracle 11g 自带的SQL Developer 编写java代码,示例:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED PWL."BC" AS
import java.io.*;
import java.io.Reader;
import java.util.Date;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.ScriptableObject;
public class BC{
public static String getBC(String plant,Date date){
//Reader in= new InputStreamReader(Shift.class.getResourceAsStream("sbbc.js"));
String res = "";
Context cx = Context.enter();
try{
Reader in= new InputStreamReader(new FileInputStream("c:\\schu.js")); //这里直接放在c:\下了,也可以将这个js做为资源同编译出的class文件打包生成jar,然后使用上述方式导入到oracle中,这样可以保护你的java源程序和javascript代码不被他人看到。
ScriptableObject scope = cx.initStandardObjects();
cx.evaluateReader(scope, in, "sbbc", 1, null);
//cx.evaluateString(scope, script, "script", 1, null);
Function fn = (Function)scope.get("SBBC3",scope); // SBBC3是schu.js中的一个function
Object args[] = {"lh",Context.javaToJS(new Date(), scope)};
Object result = fn.call(cx, scope, scope, args);
res = (String)Context.jsToJava(result, String.class);
System.out.println(res);
}catch(Exception e){
//e.printStackTrace();
res = e.getMessage();
}finally{
Context.exit();
}
return res;
}
}
3) 将以上java编译完成后发布为function 或者 存储过程。也可以执行如下代码:
create or replace
FUNCTION FUNBC
( plant IN VARCHAR2
, dateBC IN DATE
) RETURN VARCHAR2 AS
LANGUAGE java
NAME 'BC.getBC(java.lang.String, java.util.Date) return java.lang.String';
4) 授权PWL中java 相关的内容,具体的授权如下:(windows vista 及以后版本需要)
dbms_java.grant_permission( 'PWL', 'SYS:java.lang.RuntimePermission', 'getProtectionDomain', '' );
dbms_java.grant_permission( 'PWL', 'SYS:java.lang.RuntimePermission', 'createClassLoader', '' );
dbms_java.grant_permission( 'PWL', 'SYS:java.io.FilePermission', 'c:\sbbc.js', 'read' );
5) 编写测试代码
DECLARE
PLANT VARCHAR2(200);
DATEBC DATE;
v_Return VARCHAR2(2000);
BEGIN
PLANT := 'lh';
DATEBC := sysdate;
v_Return := FUNBC(
PLANT => PLANT,
DATEBC => DATEBC
);
DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;
这样就可以将javascript中的function 映射为oracle中的函数,灵活的逻辑可以写在外部处理了。