greenplum数据库存储过程和函数开发
GREENPLUM使用技巧(四)-greenplum 存储过程和函数开发
上一篇 / 下一篇 2011-07-12 13:10:05 / 个人分类:GREENPLUM
查看( 54 ) / 评论( 4 ) / 评分( 15 / 0 )
greenplum的底层是POSTGRE SQL,
因此greenplum的函数和存储过程实现的主要方式之一是通过PL/pgSQL语言
(也可以调用C、JAVA等语言实现的程序,不是这篇文章的介绍重点)。其具体语法格式如下
CREATE FUNCTION RETURNS AS $$
DECLARE
;
BEGIN
;
;
;
[exception]
when then
/
END;
$$ LANGUAGE plpgsql [volatile|immutable|stable];
在GREENPLUM当中存储过程和函数的界限不明显,如果有具体的返回值,就是函数。
如果没有返回值(return void)就是存储过程。比如函数的定义如下
CREATE OR REPLACE FUNCTION somefunc() RETURNS integer AS $$
DECLARE
quantity integer := 30;
BEGIN
RAISE NOTICE ’Quantity here is %’, quantity; -- Quantity here is 30
quantity := 50;
--
-- Create a subblock
--
DECLARE
quantity integer := 80;
BEGIN
RAISE NOTICE ’Quantity here is %’, quantity; -- Quantity here is 80
END;
RAISE NOTICE ’Quantity here is %’, quantity; -- Quantity here is 50
RETURN quantity;
END;
$$ LANGUAGE plpgsql;
存储过程如下
CREATE OR REPLACE _emp()
returns void
as
$$
BEGIN
truncate view.updated_record;
insert into view.updated_record
select y.* p_edw x right outer join emp_src y pid pid is not null;
p_edw
greenplum数据库set deptno=y.deptno,
sal=y.sal
from view.updated_record y
pid;
insert into emp_edw
select y.* from emp_edw x right outer join emp_src y pid pid is null;
end;
$$ language 'plpgsql';
greenplum的函数/存储过程的调用,如果放在PSQL中调用,可以用下面方式
_emp();
如果嵌套在一个过程里调用,用下面的方式。
CREATE FUNCTION RETURNS AS $$
DECLARE
;
BEGIN
perform. _emp();
[exception]
when then
/
END;
$$ LANGUAGE plpgsql [volatile|immutable|stable];
除了自定义函数以外,GREENPLUM也提供了相关的内置函数和窗口函数供开发者直接使用。
在使用GREENPLUM进行函数/存储过程开发时需要注意的几个重要问题
1、GREENPLUM不支持触发器
2、GREENPLUM中的函数分成三种类型IMMUTABLE, STABLE, VOLATILE
IMMUTABLE类型函数,对于特定的参数总是返回相同的结果,它不能修改数据库。
STABLE类型函数,表示在一次SQL的所有记录中,对于特定的参数,总是返回相同的结果,
但是如果在不同的SQL,可能返回
的结果不同。current_timestamp这样的函数就属于这类函数,
它在一个事务中不会发生变化。
VOLATILE类型函数,即使在一个单表扫描中,相同的参数也可能返回不同的结果。
比如random(), currval(), timeofday()等等。
对于IMMUTABLE类型函数GREENPLUM完全支持,而为了保证数据的一致性,
对于STABLE, VOLATILE函数则是有条件支持,比如如果含有SQL,
这些函数只能在MASTER上执行,而不能再SEGMENT层面执行。比如
SELECT setval('myseq', 201);
SELECT foo(); ---没有from子句。
用户自定义的函数如果没有特别声明,认为是VOLATILE类型的函数。
用来实现聚合操作的函数必须是IMMUTABLE函数
4、如果函数访问对象,则不能在SQL中使用。比如
CREATE OR REPLACE FUNCTION f_channel_id(p_prod_id numeric) RETURNS varchar AS $$
DECLARE
v_channel_id varchar(100) ;
BEGIN
v_channel_id := array(select distinct channel_id from sales where prod_id=44 order by channel_id) ;
return v_channel_id;
END;
$$ LANGUAGE plpgsql immutable;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。