异常捕获:ON EXCEPTION
用ON EXCEPTION 语句捕获一个或一组特定的异常(即错误),用错误号 标识。
ON EXCEPTION 语句与RAISE EXCEPTION 语句一起 提供存储过程语言(SPL)的错误 捕获和恢复机制。
在一个语句块内可以定义多个 ON EXCEPTION 语句。
被捕获的异常可以是系统异常或用户定义的异常。
一旦异常被捕获, 错误状态即被清除。
用ON EXCEPTION 语句捕获一个或一组特定的异常(即错误),用错误号 标识。
ON EXCEPTION 语句与RAISE EXCEPTION 语句一起 提供存储过程语言(SPL)的错误 捕获和恢复机制。
在一个语句块内可以定义多个 ON EXCEPTION 语句。
被捕获的异常可以是系统异常或用户定义的异常。
一旦异常被捕获, 错误状态即被清除。
GBase 8s数据库支持C和JAVA写的用户自定义例程(UDR),以扩展用户对数据库的操作的功能。
以下我们分别以简单的例子介绍C UDR和Java UDR。
C UDR使用C语言为基础开发。
参考两个文档:《用户定义例程和数据类型开发者指南》和《DataBlade开发者工具用户指南》
#include <stdio.h>
char *Hello(char *message )
{
return(message);
}
main()
{
char *message = "Hello World!";
printf("%s\n", Hello(message));
}
函数 | 返回类型 | 描述 | 示例 | 结果 |
---|---|---|---|---|
COUNT(*) | 数值 | 返回行数 | COUNT(*) | 100 |
COUNT(UNIQUE col) COUNT(DISTINCT col) | 数值 | 返回去重后的行数(忽略NULL行) | COUNT(UNIQUE col1) | 50 |
COUNT(col) | 数值 | 返回行数 | COUNT(col1) | 100 |
AVG(col/expr) | 数值 | 返回表达式或指定的列的数值平均值 | AVG(col1) | 64 |
AVG(UNIQUE col) AVG(DISTINCT col) | 数值 | 返回指定的列中唯一值的数值平均值 | AVG(UNIQUE col1) | 61 |
MAX(col/expr) | 数值 | 返回指定的列或表达式中的最大值 | MAX(col1) | 100 |
MIN(col/expr) | 数值 | 返回指定的列或表达式中的最小值 | MIN(col1) | 10 |
SUM(col/expr) | 数值 | 返回指定的列或表达式中的数值总和 | SUM(col1) | 5050 |
RANGE(col) | 数值 | 返回数值列表达式参数的值的范围 | RANGE(col1) | 99 |
STDEV(col) | 数值 | 计算数据集的标准差 | STDEV(col1) | 200 |
VARIANCE(col) | 数值 | 总体方差的估计值,即标准差的平方 | VARIANCE(col1) | 40000 |
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
优点
存储过程可封装,并隐藏复杂的商业逻辑。
存储过程可以回传值,并可以接受参数。
存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
存储过程可以用在数据检验,强制实行商业逻辑等。
从Oracle迁移到GBase 8s数据库时,存储过程中有使用游标绑定投影列的语法:
open cursor1 for 'select ? as username, ? usertext from dual' using p_username, p_usertext;
这个语法(投影列绑定变量)在GBase 8s中暂时还是不支持的。由于使用的是dual表,实际上只是需要返回这两个值到游标上。我们可以通过如下改造,达到类似的效果。示例存储过程如下:
最近碰到客户从Oracle迁移到GBase 8s使用到字段加密解密功能,使用到了Utl_raw.cast_to_varchar2、Utl_raw.cast_to_raw、Utl_encode.base64_decode、dbms_obfuscation_toolkit.desdecrypt等oracle特有函数,这些与GBase 8s自带的加密函数DECRYPT_CHAR并不兼容。客户暂时只能考虑使用程序加密的方式实现。
对于GBase 8s数据库来说,其实也可以使用自定义例程(UDR,可以是基于C,也可能是基于Java)的方式来扩展函数使用。以下我们就以这个加密解密功能来说明Java UDR的创建与使用。
从mysql迁移到GBase 8s数据库时,原有find_in_set函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数实现的功能是:第一个参数pstr在第二个参数pstrlist,以pdel为分隔符(默认为,)中的分隔位置。
从mysql迁移到GBase 8s数据库时,原有timestampdiff()函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数的功能是:按第一个参数interval的值,获取dt1与dt2的日期时间差值。如果dt1 > dt2且isabs为'f'时, 将显示负值。
GBase 8s的触发器不支持raise exception,条件判断等存储过程中可以使用的功能,若有需求,可以使用触发存储过程的功能。
以下以insert触发器为示例,创建触发存储过程:
1,创建相应的表
create table tab1
(
id integer,
name varchar(40),
primary key (id)
) ;
create table tab2
(
id integer,
name varchar(40),
uptime datetime year to second
default current year to second
) ;
测试在java程序中调用GBase 8s的函数调用。
1)、首先创建需要调用的函数或者存储过程
-- out value 是 out变量值
-- return value 是函数返回值
create function myfunc2(f1 int,out f2 varchar(128)) returns varchar(128);
let f2 = "out value: myfunc2";
return "return value: myfunc2 and f1: " || f1;
end function;
2)、java程序调用函数myfunc2示例