存储过程编写

  存储过程

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      |
+-------+
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值