存储过程
存储过程开发,编写,兼容性函数。

GBase 8s 编写使用UDR(C/Java)

GBase 8s数据库支持C和JAVA写的用户自定义例程(UDR),以扩展用户对数据库的操作的功能。
以下我们分别以简单的例子介绍C UDR和Java UDR。

C UDR

C UDR使用C语言为基础开发。
参考两个文档:《用户定义例程和数据类型开发者指南》和《DataBlade开发者工具用户指南》

1, 编写代码,示例使用简单的Hello.c

#include <stdio.h>

char *Hello(char *message )
{
    return(message);
}

main()
{
    char *message = "Hello World!";
    printf("%s\n", Hello(message));
}


阅读全文»

[GBase 8s 教程]GBase 8s 常用函数、表达式

聚集函数

函数返回类型描述示例结果
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


阅读全文»

GBase 8s存储过程

  存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

优点

存储过程可封装,并隐藏复杂的商业逻辑。
存储过程可以回传值,并可以接受参数。
存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
存储过程可以用在数据检验,强制实行商业逻辑等。






阅读全文»

GBase 8s存储过程通过table(set)实现投影列绑定变量

  从Oracle迁移到GBase 8s数据库时,存储过程中有使用游标绑定投影列的语法:

open cursor1 for 'select ? as username, ? usertext from dual' using p_username, p_usertext;

  这个语法(投影列绑定变量)在GBase 8s中暂时还是不支持的。由于使用的是dual表,实际上只是需要返回这两个值到游标上。我们可以通过如下改造,达到类似的效果。示例存储过程如下:

阅读全文»

在GBase 8s上使用java udr实现Oracle兼容的加密解密功能

  最近碰到客户从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的创建与使用。


阅读全文»

GBase 8s自定义使用find_in_set()函数

从mysql迁移到GBase 8s数据库时,原有find_in_set函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数实现的功能是:第一个参数pstr在第二个参数pstrlist,以pdel为分隔符(默认为,)中的分隔位置。


阅读全文»

GBase 8s自定义使用timestampdiff()函数

从mysql迁移到GBase 8s数据库时,原有timestampdiff()函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程。以下以存储过程方式创建。
该函数的功能是:按第一个参数interval的值,获取dt1与dt2的日期时间差值。如果dt1 > dt2且isabs为'f'时, 将显示负值。


阅读全文»

GBase 8s触发存储过程示例

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的函数示例

测试在java程序中调用GBase 8s的函数调用。

1, OUT及RETURN返回值

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示例

阅读全文»

GBase 8s使用unix_timestamp()函数

从mysql迁移到GBase 8s数据库时,原有unix_timestamp()函数在GBase 8s中不可用,因此需要自己创建相应的函数,可以使用C或者JAVA创建自定义例程,也可以使用存储过程或者函数。以下以存储过程/函数方式创建。
注:以下语法根据GBase 8s v8.7 2.0.1a2_2版本进行过更新。


阅读全文»