存储过程
Sql是一个面向函数的语言。功能的强弱取决与函数的丰富程度。任何数据库提供的函数都是有限的,为了扩展功能,很多数据库系统开始支持过程化语句,用于编写自定义函数,这些函数使用时与内置函数一样。存储过程还有另一个好处,减少了与客户端的交换次数,有助于提高性能。SQLHUB是一个分布式数据库,主要用于数据集成。它也提供了函数扩展功能。它提供了三种方式:sql、java类、java脚本:
SQL
SQLHUB提供了过程化sql支持,语法与oracle的pl/sql相似,但做了很多改进,如:
n 没有declare部分,变量不需要声明,动态数据类型,变量长度不做约束
n 可以对数据集变量、数组参数执行dml(select、insert、update、delete)操作
n 例外为字符型,无须声明
n 系统变量result自动保存每条语句的执行结果,可以在下一条语句中直接使用
n 可以直接执行DDL语句
n 简单的动态SQL执行方法,execute函数
举例:
--记录字符串合并
create or replace procedure rowstr() return varchar as
begin
v_fields := fields(data);
v_rowcount := rowcount(v_fields);
v_sum := '';
for i in 1..v_rowcount loop
if i > 1 then
v_sum := v_sum + ',';
end if;
v_sum := v_sum + eval('data.' + v_fields(i, 1));
end loop;
return v_sum;
end;
执行:
select rowstr() from 部门
结果:
+------------+
| ROWSTR()
|
+------------+
| 40,行政部
, |
| 20,开发部
, |
| 30,销售部
, |
| 10,财务部
, |
+------------+
JAVA脚本
Sqlhub包含了eval_java内置函数,可以执行动态java脚本。可以用包装eval_java后在外面方便调用。
EVAL_JAVA
语法:
eval_java(strJava)
功能:
执行
java代码,需要groovy包的支持,里面包含了conn参数可以用于执行SQL,详细见:DbConn
返回值类型:
执行结果
示例:
|
eval_java('Math.abs(-1)');
|
eval_java('Math.abs(-1)');
|
|
+-----------+
| abs(-1)') |
+-----------+
| 1
|
+-----------+
eval_java('conn.eval("user()")');
|
+-----------+
| abs(-1)') |
+-----------+
| 1
|
+-----------+
eval_java('Math.abs(-1)');
|
|
+------------------+
| eval("user()")') |
+------------------+
| HG
|
+------------------+
|
+-----------+
| abs(-1)') |
+-----------+
| 1
|
+-----------+
|
JAVA
Java存储过程必须继承自com.hg.sql.JavaProcedure类,覆盖eval方法,返回结果。在处理过程中可以调用DbConn中的方法,执行操作。
举例:
package com.hg.ext;
import java.util.HashMap;
import com.hg.db.DbTypes;
import com.hg.sql.JavaProcedure;
import com.hg.sql.DbConn;
public class SID extends JavaProcedure {
/**
* id
*/
private int id = 0;
/**
* 执行
*/
public Object eval(DbConn conn, HashMap paramMap) throws Exception {
this.resType = DbTypes.INTEGER;
this.id++;
return String.valueOf(this.id);
}
}
创建存储过程
create procedure SYS.SID return VARCHAR type JAVA AS
'com.hg.ext.SID';
执行
sys.sid();
结果
+-------+
| SID() |
+-------+
| 1
|
+-------+
128

被折叠的 条评论
为什么被折叠?



