将javascript function 转换为 oracle的Function

为什么80%的码农都做不了架构师?>>>   hot3.png

在实际的项目中,有部分业务逻辑很灵活,我们很希望可以在实施的时候由实施人员写一段小的脚本来完成。

最好的方法就是我们将脚本放到数据库中去执行,如下介绍了一种可以在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中的函数,灵活的逻辑可以写在外部处理了。

转载于:https://my.oschina.net/doz/blog/140692

你可能感兴趣的:(将javascript function 转换为 oracle的Function)