Green plum与Oracle语法上的差异:
1.通过本文档初步了解一下greenplum在语法层面与Oracle的差异,这仅仅是第一个版本,后期还会陆续更新
----------------分割线----------------
1.1数据类型
1.1.1字符类型

----------------不变的分割线----------------
一般情况下,对于Oracle的char和nchar类型,直接换成green plum的char是没有问题的;而对于变长的varchar2和nvarchar2,想图省事的话,直接换greenplum的TEXT就可以。
1.1.2数值类型

----------------不变的分割线----------------
Oracle的数值类型向greenplum的数值类型迁移过程中,只要根据Oracle数据的精度,在greenplum中选择相同或者更大精度的类型,数据就能够顺利地迁移过来。但是为了转换过来后数据库的效率(特别是整数类型的时候),需要选择合适的数据类型,才能够完整、正确并且高效地完成Oracle数据类型向greenplum数据类型的迁移。
1.1.3时间类型

----------------不变的分割线----------------
Oracle的日期时间类型向greenplum的数据迁移相对来说简单一些。由于greenplum的数据类型的极值超越Oracle,因此,数据迁移过程中,只要根据Oracle的数据精度,在greenplum中选择正确的数据类型,并留意一下二者写法的不同,应该就能够完整正确地迁移过来。
大对象
Oracle | greenplum | 备注 |
BLOB | BYTEA | 字节 |
CLOB | TEXT | 字符 |
其他类型
Oracle | greenplum | 备注 |
RAW | BYTEA | |
RAWID | OID |
1.2常用函数
1.2.1字符串操作函数


注意:以上两个截图系同一个表格
1.2.2 数值函数
Oracle | greenplum | 备注 |
BITAND | & | 对数值按位进行与运算 |
REMAINDER | % | 取模 |
abs | abs | 取绝对值 |
----------------不变的分割线----------------
1.2.3 日期函数

----------------不变的分割线----------------
1.2.4其他函数
decode是Oracle固有的一个函数,用于条件判断。其格式为:
decode(条件,值1,返回值1,值2,返回值2,...,值n,返回值n,缺省值)
当条件等于值1的时候返回返回值1,等于值n的时候返回返回值n,都不等于的时候返回缺省值。
在greenplum中,decode函数是用来解码的,和encode函数相对。对于Oracle的decode函数,可以把它转换成case when的SQL语句,得到一样的效果。另外,Oracle也支持case when的语法,用法和greenplum一样。

----------------不变的分割线----------------
1.3存储过程
1.3.1最简单的存储过程

1.3.2带输入输出参数的存储过程

1.3.3 SELECT INTO

1.3.4 带条件判断的存储过程

----------------不变的分割线----------------
1.4 动态执行
Oracle和greenplum基本是一样的:
EXECUTE'DELETE FROM mytable WHERE id = key';
执行没有返回值的查询
Oracle和greenplum基本也是一样的:
UPDATE mytableSET val = val + delta WHERE id = key;
INSERT INTOmytable VALUES(key, value);
TRUNCATE TABLEmytable;
DELETE FROMmytable WHERE id = key;
----------------不变的分割线----------------
1.5 LOOP循环
1.5.1简单的LOOP循环


1.5.2返回结果集的LOOP

----------------不变的分割线----------------
1.6 游标
在greenplum中,我们一般很少使用游标,因为当我们使用FOR LOOP的时候,数据库后台自动就会转化成游标。不过,这里我们还是可以简单介绍一下greenplum中游标的使用。
游标的声明
DECLARE
curs1 refcursor;
curs2 CURSOR FOR SELECT * FROM tenk1;
curs3 CURSOR (key INTEGER) IS SELECT * FROM tenk1 WHERE unique1 = key;
第一个游标curs1是一个通用游标,没有绑定具体的查询;第二个游标curs2绑定了具体的查询;第三个游标curs3也是一个绑定游标,而且是一个带参数的游标。
打开没有绑定查询的游标
普通查询
OPEN curs1 FORSELECT * FROM foo WHERE key = mykey;
动态查询
OPEN curs1 FOREXECUTE 'SELECT * FROM ' || quote_ident($1);
打开已经绑定查询的游标
OPEN curs2;
OPEN curs3(42);
使用游标
FETCH curs1INTO rowvar;
FETCH curs2INTO foo,bar, baz;
关闭游标
CLOSE curs1;
----------------------------------------------
<点亮梦想.拒绝平庸>
600团队(QQ群:851604218)




