项目地址:
https://github.com/Dark-Athena/dbms_mle_ext_pkg-oracle
开发目的:
用于简单化oracle 21c mle功能的使用
特点:
- 可以轻松的从其他多种来源导入js模块,
- 可以更轻松的定义输入及输出参数,
- 你只需要了解plsql及js两种语言各自的语法,无需了解mle的特定语法
注意事项:
- 由于可自由定义参数名称及参数个数,因此对于输入或输出参数的任意一个列表,暂只支持NUMBER/VARCHAR2参数的混用或CLOB参数的单独使用
- 由于导入模块是采用简单的拼接字符串,因此请确认模块内有函数名称的定义,而非"_self"
案例
例1:基本用法
--example 1
declare
i_parameter mle_js_ext_pkg.parameter_list;
o_parameter mle_js_ext_pkg.parameter_list;
i_js_code clob := '';
begin
i_parameter('person').p_value := 'World';
o_parameter('greeting').p_value := null;
i_js_code := 'var greeting = "Hello, " + person + "!";';
mle_js_ext_pkg.exec_js(i_js_code => i_js_code,
i_parameter => i_parameter,
o_parameter => o_parameter);
dbms_output.put_line(o_parameter('greeting').p_value);
end;
例2:定义参数类型为数字(默认VARCHAR2)
--example 2 number type
declare
i_parameter mle_js_ext_pkg.parameter_list;
o_parameter mle_js_ext_pkg.parameter_list;
i_js_code clob := '';
begin
i_parameter('a').p_value := '2';
i_parameter('a').p_type := 'NUMBER';
i_parameter('b').p_value := '5';
i_parameter('b').p_type := 'NUMBER';
o_parameter('result1').p_value := null;
o_parameter('result1').p_type := 'NUMBER';
o_parameter('result2').p_value := null;
o_parameter('result2').p_type := 'NUMBER';
i_js_code := '
var result1 = a+b;
var result2 = a*b;
';
mle_js_ext_pkg.exec_js(i_js_code => i_js_code,
i_parameter => i_parameter,
o_parameter => o_parameter);
dbms_output.put_line(o_parameter('result1').p_value);
dbms_output.put_line(o_parameter('result2').p_value);
end;
/
例3:从一个动态sql导入js模块,输出一个clob参数
--example 3 import js module from a dynamic sql and export clob values
declare
i_parameter mle_js_ext_pkg.parameter_list;
o_parameter mle_js_ext_pkg.parameter_list_clob;
i_js_source clob ;
i_js_code clob ;
begin
i_parameter('url').p_value := 'https://www.darkathena.top';
o_parameter('qrcode_pic') := null;
i_js_code := q'{const code = qrcode(4, 'L');
code.addData(url);
code.make();
qrcode_pic = code.createDataURL(4);
}';
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_sql => q'{select content from mle_js_contents where name='qrcode'}');
mle_js_ext_pkg.exec_js(i_js_code => i_js_code,
i_parameter => i_parameter,
o_parameter => o_parameter,
i_js_source => i_js_source);
dbms_output.put_line(o_parameter('qrcode_pic'));
end;
/
例4:从一个clob变量导入js模块
--example 4 import js module from a clob value
declare
i_parameter mle_js_ext_pkg.parameter_list;
o_parameter mle_js_ext_pkg.parameter_list_clob;
i_js_source clob;
i_js_code clob;
l_clob clob;
begin
i_parameter('url').p_value := 'https://www.darkathena.top';
o_parameter('qrcode_pic') := null;
i_js_code := q'{const code = qrcode(4, 'L');
code.addData(url);
code.make();
qrcode_pic = code.createDataURL(4);
}';
dbms_lob.createtemporary(l_clob, true);
select content into l_clob from mle_js_contents where name = 'qrcode';
mle_js_ext_pkg.import_module(i_src => i_js_source, i_import => l_clob);
mle_js_ext_pkg.exec_js(i_js_code => i_js_code,
i_parameter => i_parameter,
o_parameter => o_parameter,
i_js_source => i_js_source);
dbms_output.put_line(o_parameter('qrcode_pic'));
end;
例5:从一个url导入js模块(可能需要配置wallet及acl)
--example 5 import js module from a url
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_url => 'http://cdnjs.cloudflare.com/ajax/libs/qrcode-generator/1.4.4/qrcode.min.js');
例6:从一个文件导入js模块
--example 6 import js module from a file
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_dir => 'DB_BACKUP_DIR',
i_filename => 'qrcode.min.js');
例7:在一次执行中导入多个js模块
--example 7 import multiple js module
declare
i_js_source clob;
begin
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_dir => 'DB_BACKUP_DIR',
i_filename => '1.js');
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_dir => 'DB_BACKUP_DIR',
i_filename => '2.js');
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_url => 'http://cdnjs.cloudflare.com/ajax/libs/qrcode-generator/1.4.4/qrcode.min.js');
mle_js_ext_pkg.import_module(i_src => i_js_source,
i_sql => q'{select content from mle_js_contents where name='qrcode'}');
end;
/