更新时间:2024-11-11 GMT+08:00

单行函数

序号

Oracle数据库

GaussDB数据库

1

数值函数

支持,有差异

2

返回字符值的字符函数

支持,有差异

3

返回数值的字符函数

支持,有差异

4

字符集函数

不支持

5

Collation函数

不支持

6

日期时间函数

支持,有差异

7

通用比较函数

支持,有差异

8

转换函数

支持,有差异

9

大对象函数

支持,有差异

10

集合函数

不支持

11

层次函数

支持

12

数据挖掘功能函数

不支持

13

XML类型函数

支持,有差异

14

JSON函数

不支持

15

编码解码函数

支持,有差异

16

空值相关的函数

支持

17

环境和标识符函数

支持,有差异

表1 数值函数

序号

Oracle数据库

GaussDB数据库

差异

1

ABS

支持

-

2

ACOS

支持

-

3

ASIN

支持

-

4

ATAN

支持

-

5

ATAN2

支持

-

6

BITAND

支持

-

7

CEIL

支持

-

8

COS

支持

-

9

COSH

支持

-

10

EXP

支持

-

11

FLOOR

支持

-

12

LN

支持

-

13

LOG

支持

-

14

MOD

支持,有差异

  • 返回类型不一致,Oracle数据库类型包括BINARY_DOUBLE,BINARY_FLOAT,NUMBER;GaussDB返回类型包括int2,int4,int8,numeric。
  • 当第一个入参为数值类型时,第二个参数必须为int、numeric类型或能够转换为numeric的类型。在a_format_version为10c,a_format_dev_version为s6时,当第一个参数为能够转为numeric的text类型时,第二个参数必须为不超过int4的数值类型。

15

NANVL

支持,有差异

GaussDB不支持直接声明或浮点数除0得到NaN。

16

POWER

支持

-

17

REMAINDER

支持,有差异

返回值数据类型不同。

GaussDB:

  • 当一个输入是float4时,另一个是numeric时,返回float4类型。
  • 当两个输入都是float4时,返回float4类型。
  • 当两个输入都是float8时,返回float8类型。
  • 其他数据类型,返回numeric

Oracle:

返回值类型是number。

18

ROUND

支持,有差异

  • 第一个参数n的float类型,GaussDB存在精度损失,比Oracle数据库精度低。
  • 返回类型不一致。round(n, integer)形式,Oracle数据库NUMBER类型,GaussDB返回numeric类型;round(n)形式,Oracle数据库n的数据类型,GaussDB只能返回float8和numeric类型,缺少float4返回类型。
  • GaussDB判断入参有null,执行框架返回null的逻辑与Oracle数据库不一致。
    SELECT round(NULL,'q');

    Oracle数据库null,GaussDB报错invalid input syntax for integer: "q"。

19

SIGN

支持

-

20

SIN

支持

-

21

SINH

支持

-

22

SQRT

支持

-

23

TAN

支持

-

24

TANH

支持,有差异

返回值数据类型不同。

GaussDB:

  • 当输入是float8时,返回float8类型。
  • 当输入是numeric时,返回numeric类型。

Oracle:

返回值类型是number。

25

TRUNC

支持

-

26

WIDTH_BUCKET

支持

-

表2 返回字符值的字符函数

序号

Oracle数据库

GaussDB数据库

差异

1

CHR

支持,有差异

  • 输入的数字不符合现有字符集时,在JDBC下GaussDB会报错,Oracle数据库会返回乱码。
  • 输入0、256等时Oracle数据库会返回Ascii码为0的字符,GaussDB会在'\0;处截断。

2

CONCAT

支持

-

3

INITCAP

支持,有差异

返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。

4

LOWER

支持,有差异

  • 返回值类型不一致,Oracle数据库和输入类型一致的数据类型。
  • 对时间格式上隐式转换问题,输入时间类型时,隐式转换为字符串再进行lower操作。
    SELECT LOWER(TO_DATE('2012-12-10','YYYY-MM-DD')); 

    Oracle返回10-DEC-12,GaussDB返回2012-12-10 00:00:00。

  • 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。

5

LPAD

支持

-

6

LTRIM

支持,有差异

返回值类型不一致。

当输入为字符数据类型时,Oracle返回VARCHAR2类型;输入为数据库创建时指定的国家字符集时,Oracle返回NVARCHAR2类型;输入为LOB类型时,Oracle返回LOB类型,GaussDB返回TEXT类型。

7

NCHR

支持,有差异

  • 返回值字节长度与Oracle数据库不一致。
  • 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。
  • 返回入参对应的字节数组时,单个字节在[0x80-0xFF]范围,会返回“?”,Oracle数据库返回“?”、或者不输出、或者会报错。

8

NLS_LOWER

支持,有差异

  • 返回值类型不同,输入为字符数据类型时,Oracle返回VARCHAR2类型;输入为LOB类型时,Oracle返回LOB类型,GaussDB返回TEXT类型。
  • nlsparam参数Oracle数据库还可以传入除nls_sort外的其他参数种类而不报错,GaussDB只支持nls_sort。
  • 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。

9

NLS_UPPER

支持,有差异

  • 返回值类型不同,输入为字符数据类型时,Oracle返回VARCHAR2类型;输入为LOB类型时,Oracle返回LOB类型,GaussDB返回TEXT类型。
  • nlsparam参数Oracle数据库还可以传入除nls_sort外的其他参数种类而不报错,GaussDB只支持nls_sort。
  • 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。

10

NLSSORT

支持

-

11

REGEXP_REPLACE

支持,有差异

  • GaussDB入参source_char不支持NCLOB类型。
  • 入参match_param选项 'n' 含义有差异:GaussDB中 'n' 选项与 'm' 选项含义相同,表示采用多行模式匹配;而 Oracle 表示 (.) 能匹配 '\n' 字符,没有指定该选项时默认不能匹配 '\n' 字符。GaussDB中 (.) 默认匹配 '\n' 选项,不需要指定选项。
  • 不同正则表达式匹配结果可能不一致。
    SELECT REGEXP_REPLACE('abc01234xyz', '(.*?)(\d+)(.*)', '#', 'g') FROM DUAL; 

    Oracle报错,GaussDB返回#####xyz。

  • 在UTF-8编码字符集下中文输入时匹配结果可能不一致。Oracle需要在GBK字符集实现中文字符串的正则表达式匹配。
  • 包含部分转义字符的正则表达式匹配结果可能不一致。
    SELECT REGEXP_REPLACE('abcabc', '\abc', '#', 'g') FROM DUAL; 

    Oracle报错,GaussDB返回abcabc。

  • 匹配规则受aformat_regexp_match参数影响,具体影响规格请参见《开发指南》中“SQL参考 > 函数和操作符 > 字符处理函数和操作符”章节REGEXP_REPLACE函数部分。

12

REGEXP_SUBSTR

支持,有差异

匹配规则受aformat_regexp_match参数影响,具体影响规格请参见《开发指南》中“SQL参考 > 函数和操作符 > 字符处理函数和操作符”章节REGEXP_SUBSTR函数部分。

13

REPLACE

支持

-

14

RPAD

支持

-

15

RTRIM

支持

-

16

SUBSTR

支持

-

17

TRANSLATE

支持

-

18

TRIM

支持

-

19

UPPER

支持,有差异

  • 返回值类型不一致,Oracle数据库和输入类型一致的数据类型,GaussDB返回TEXT类型。
  • 对时间格式上隐式转换问题,输入时间类型时,隐式转换为字符串再进行upper操作。
    SELECT UPPER(TO_DATE('2012-12-10','YYYY-MM-DD')); 

    Oracle返回10-DEC-12,GaussDB返回2012-12-10 00:00:00。

  • 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。

20

INSTRB

支持

-

表3 返回数值的字符函数

序号

Oracle数据库

GaussDB数据库

差异

1

ASCII

支持,有差异

返回值类型不同。Oracle数据库返回类型为uint4,GaussDB为int4。

2

INSTR

支持

-

3

LENGTH

支持

-

4

REGEXP_COUNT

支持,有差异

  • GaussDB入参source_char不支持NCLOB类型。
  • 入参match_param选项 'n' 含义有差异:GaussDB中 'n' 选项与 'm' 选项含义相同,表示采用多行模式匹配;而 Oracle 表示 (.) 能匹配 '\n' 字符,没有指定该选项时默认不能匹配 '\n' 字符。GaussDB中 (.) 默认匹配 '\n' 选项,不需要指定选项。
  • 不同正则表达式匹配结果可能不一致。
  • 在UTF-8编码字符集下中文输入时匹配结果可能不一致。Oracle需要在GBK字符集实现中文字符串的正则表达式匹配。
  • 包含部分转义字符的正则表达式匹配结果可能不一致。
  • 匹配规则受aformat_regexp_match参数影响,具体影响规格请参见《开发指南》中“SQL参考 > 函数和操作符 > 字符处理函数和操作符”章节REGEXP_COUNT函数部分。

5

REGEXP_INSTR

支持,有差异

匹配规则受aformat_regexp_match参数影响,具体影响规格请参见《开发指南》中“SQL参考 > 函数和操作符 > 字符处理函数和操作符”章节REGEXP_INSTR函数部分。

6

LENGTHC

支持

-

表4 日期时间函数

序号

Oracle数据库

GaussDB数据库

差异

1

ADD_MONTHS

支持,有差异

  • 公元后到公元前,GaussDB会和Oracle数据库相差1年。
  • GaussDB的计算结果范围可以到-4714年,Oracle数据库只到-4713年。

2

CURRENT_DATE

支持,有差异

GaussDB不支持nls_date_format参数设置时间显示格式。

3

CURRENT_TIMESTAMP

支持,有差异

Oracle数据库参数支持范围(0 ~ 9)。

GaussDB支持范围(0 ~ 6),微秒末位零不显示。

4

DBTIMEZONE

支持,有差异

GaussDB不支持自带tz的timestamp类型接口的调用。

5

EXTRACT

支持

-

6

LAST_DAY

支持,有差异

返回值类型不一致。

7

LOCALTIMESTAMP

支持,有差异

Oracle数据库参数支持范围(0 ~ 9)。

GaussDB支持范围(0 ~ 6),微秒末位零不显示。

8

MONTHS_BETWEEN

支持,有差异

入参类型不一致。

9

NEW_TIME

支持,有差异

new_time函数的第一个入参为字面量时,字面量的格式以及函数的返回值类型均与Oracle数据库不一致。

10

NEXT_DAY

支持

-

11

NUMTODSINTERVAL

支持,有差异

GaussDB不支持dsinterval类型,暂时用interval兼容dsinterval类型。

12

NUMTOYMINTERVAL

支持,有差异

GaussDB不支持yminterval类型,暂时用interval兼容yminterval类型。

13

SESSIONTIMEZONE

支持,有差异

  • 赋值语法差异。GaussDB为set session time zone 8。Oracle为alter session set time_zone= '+08:00'。
  • 默认值差异。GaussDB为时区名称形式如:PRC。Oracle为偏移量形式,如:+08:00。

14

SYS_EXTRACT_UTC

支持

-

15

SYSDATE

支持,有差异

返回值类型不一致。

16

SYSTIMESTAMP

支持,有差异

GaussDB毫秒计算只支持6位,Oracle数据库支持9位。

17

TO_CHAR

支持,有差异

fmt‘5’未在Oracle数据库文档中,未适配。

18

TO_DSINTERVAL

支持,有差异

GaussDB不支持dsinterval类型,暂时用interval兼容dsinterval类型。

19

TO_TIMESTAMP

支持,有差异

GaussDB毫秒计算只支持6位,Oracle数据库支持9位。

20

TO_TIMESTAMP_TZ

支持,有差异

GaussDB的timestamptz等价于Oracle的timestampwithloacltimezone,缺少Oracle对应的timestamptz类型。nls_date_language只支持ENGLISH和AMERICAN两种语言。

21

TO_YMINTERVAL

支持,有差异

GaussDB不支持yminterval类型,暂时用interval兼容yminterval类型。

22

TRUNC

支持,有差异

GaussDB返回的类型与第一个入参的类型保持一致,Oracle始终返回date类型,另外支持指定的format也有区别,具体支持的列表详见《开发指南》的“SQL参考 > 函数和操作符 > 时间和日期处理函数和操作符”章节。

23

TZ_OFFSET

支持,有差异

接收一个时区名称为入参的时候,时区名称的类型比Oracle数据库要少。

表5 通用比较函数

序号

Oracle数据库

GaussDB数据库

差异

1

GREATEST

支持,有差异

  • GaussDB不支持NLS_SORT参数指定的比较方式,只支持二进制比较。
  • GaussDB不支持多语种的表达式。

2

LEAST

支持,有差异

  • GaussDB不支持NLS_SORT参数指定的比较方式,只支持二进制比较。
  • GaussDB不支持多语种的表达式。
表6 转换函数

序号

Oracle数据库

GaussDB数据库

差异

1

ASCIISTR

支持

-

2

CAST

支持,有差异

  • GaussDB不支持multiset子句。
  • GaussDB不支持nlsparam参数。

3

HEXTORAW

支持

-

4

RAWTOHEX

支持

-

5

TO_BINARY_DOUBLE

支持,有差异

GaussDB不支持nlsparam参数。

6

TO_BINARY_FLOAT

支持,有差异

GaussDB不支持nlsparam参数。

7

TO_BLOB

支持,有差异

  • GaussDB不支持long raw类型。
  • GaussDB不支持bfile、mime_type类型。

8

TO_CLOB

支持

-

9

TO_DATE

支持,有差异

  • 不支持多语种参数。
  • 返回类型不一致。
  • 缺少控制参数NLS_DATE_FORMAT。
  • 部分format格式不支持。
  • fmt = 'j'。 1582年10月15日之前Oracle数据库与GaussDB输出不一致。
  • 无分割符时,不保证与Oracle数据库完全一致。如to_date(‘220725’, ‘yymmdd’),yy/rr按照固定长度4解析,会解析为2207年25月,25非法月份则会报错。

10

TO_MULTI_BYTE

支持

-

11

TO_NCHAR

支持,有差异

  • GaussDB:将入参的类型转换为text。
  • Oracle:将入参的类型转换为国家字符集(national character set)。

12

TO_NUMBER

支持,有差异

GaussDB不支持NLS_PARAM参数。

GaussDB与Oracle的fmt选项差异点描述:

1、$

GaussDB不支持该fmt。

2、, (comma)

GaussDB:逗号可以出现在fmt的任意位置。

Oracle:

  • 在format中,逗号只能出现在整数部分,且不能出现在数字开头;在原数据中,逗号可以在数字的开头位置。
  • 支持format中的逗号与原数据的逗号个数和位置不一致,但最后一个逗号的位置需一致。
  • 原数据和Format中的连续逗号,等同于没有逗号。
  • 当原数据中没有逗号时,format的最后一个逗号后面的数字位数需与原数据相等。

3、B

GaussDB未实现该功能。

4、C

GaussDB不支持NLS参数。

5、G

GaussDB不支持NLS参数。

6、L

GaussDB不支持NLS参数。

7、U

GaussDB不支持NLS参数。

8、D

GaussDB不支持NLS参数。

9、PR

GaussDB:等同于S,返回负数。

Oracle:

  • 返回<尖括号>中的负值。
  • 返回带前导和尾随空格的正值。
  • 限制:PR格式元素只能出现在数字格式模型的最后一个位置。

10、RN | rn

GaussDB未实现该功能。

TM| TM9 | TMe

GaussDB未实现该功能。

11、V

GaussDB未实现该功能。

12、FM

GaussDB当有fm时,允许format中的逗号比原数据中多,不需要严格保持一致。

Oracle返回值保留前后的空格。

13、EEEE

GaussDB未实现该功能。

13

TO_SINGLE_BYTE

支持

-

14

TREAT

支持,有差异

GaussDB不支持使用“.”操作符取值,不支持转化为object类型。

15

UNISTR

支持,有差异

GaussDB只支持UTF-8编码,Oracle数据库支持UTF-8和UTF-16编码。

表7 大对象函数

序号

Oracle数据库

GaussDB数据库

差异

1

EMPTY_BLOB

支持

-

2

EMPTY_CLOB

支持,有差异

GaussDB的CLOB类型不支持Oracle数据库中的定位器概念。

表8 层次函数

序号

Oracle数据库

GaussDB数据库

1

SYS_CONNECT_BY_PATH

不支持

表9 XML类型函数

序号

Oracle数据库

GaussDB数据库

差异

1

EXISTSNODE

支持,有差异

在入参有命名空间时,xpath和命名空间都需要定义别名。

2

EXTRACTVALUE

支持,有差异

目前仅支持xpath1.0版本。

3

SYS_XMLAGG

支持,有差异

xmlagg的别名,可使用xmlagg代替。

4

XMLAGG

支持

-

5

XMLCOMMENT

支持

-

6

XMLCONCAT

支持

-

7

XMLELEMENT

支持,有差异

xmlelement和xmlattributes的name字段赋值为NULL时,行为与Oracle不一致。

  • xmlelement的name字段赋值为NULL时,结果显示name信息为空,且不显示属性信息。
  • xmlattributes的name字段赋值为NULL时,不显示属性信息。

8

XMLEXISTS

支持,有差异

GaussDB入参为xml类型。

9

XMLFOREST

支持,有差异

GaussDB返回值为xml类型。

GaussDB不支持EVALNAME语法。

10

XMLPARSE

支持,有差异

GaussDB返回值为xml类型。

GaussDB不支持WELLFORMED语法。

11

XMLROOT

支持,有差异

GaussDB返回值为xml类型。

12

JSON_OBJECT

支持

-

13

XMLTABLE

支持,有差异

GaussDB从xml中选取数据使用的为XPath 1.0表达式,不支持声明默认命名空间,不支持多组输入及取别名,不支持省略传入数据的passing_clause子句,不支持RETURNING SEQUENCE BY REF子句和( SEQUENCE ) BY REF子句。

14

GETSTRINGVAL

支持

-

15

GETCLOBVAL

支持

-

16

XMLSEQUENCE

支持

-

表10 编码解码函数

序号

Oracle数据库

GaussDB数据库

差异

1

DECODE

支持

-

2

DUMP

支持,有差异

因存储格式不同,GaussDB数值和时间类型返回结果和Oracle数据库不一致。如,GaussDB中select dump(123); 返回Typ=23 Len=4: 123,0,0,0。Oracle中select dump(123) from dual; 返回Typ=2 Len=3: 194,2,24。

3

ORA_HASH

支持,有差异

GaussDB中有以下行为:

  • 时间类型的入参转换成字符串类型再进行hash。
  • 不支持maxbucket参数。

4

VSIZE

支持,有差异

因存储格式不同,GaussDB数值和时间类型返回结果和Oracle数据库不一致。如GaussDB中select vsize(999); 返回4。Oracle中select vsize(999) from dual; 返回3。

表11 空值相关的函数

序号

Oracle数据库

GaussDB数据库

1

COALESCE

支持

2

LNNVL

支持

3

NULLIF

支持

4

NVL

支持

5

NVL2

支持

表12 环境和标识符函数

序号

Oracle数据库

GaussDB数据库

差异

1

SYS_CONTEXT

支持,有差异

GaussDB对不支持的参数返回NULL。

以下为不支持的参数列表:

  • 'action'
  • 'is_application_root'
  • 'is_application_pdb'
  • 'audited_cursorid'
  • 'authenticated_identity'
  • 'authentication_data'
  • 'authentication_method'
  • 'cdb_domain'
  • 'cdb_name'
  • 'client_identifier'
  • 'con_id'
  • 'con_name'
  • 'current_sql_length'
  • 'db_domain'
  • 'db_supplemental_log_level'
  • 'dblink_info'
  • 'drain_status'
  • 'entryid'
  • 'enterprise_identity'
  • 'fg_job_id'
  • 'global_uid'
  • 'identification_type'
  • 'instance'
  • 'is_dg_rolling_upgrade'
  • 'ldap_server_type'
  • 'module'
  • 'network_protocol'
  • 'nls_calendar'
  • 'nls_sort'
  • 'nls_territory'
  • 'oracle_home'
  • 'os_user'
  • 'platform_slash'
  • 'policy_invoker'
  • 'proxy_enterprise_identity'
  • 'proxy_user'
  • 'proxy_userid'
  • 'scheduler_job'
  • 'session_edition_id'
  • 'session_edition_name'
  • 'sessionid'
  • 'statementid'
  • 'terminal'
  • 'unified_audit_sessionid'
  • 'session_default_collation'
  • 'client_info'
  • 'bg_job_id'
  • 'client_program_name'
  • 'current_bind'
  • 'global_context_memory'
  • 'host'
  • 'current_sqln'

2

SYS_GUID

支持

-

3

USER

支持,有差异

返回值类型不一致。

4

USERENV

支持,有差异

GaussDB对不支持的参数返回NULL。

以下为不支持的参数列表:

  • 'action'
  • 'is_application_root'
  • 'is_application_pdb'
  • 'audited_cursorid'
  • 'authenticated_identity'
  • 'authentication_data'
  • 'authentication_method'
  • 'cdb_domain'
  • 'cdb_name'
  • 'client_identifier'
  • 'con_id'
  • 'con_name'
  • 'current_sql_length'
  • 'db_domain'
  • 'db_supplemental_log_level'
  • 'dblink_info'
  • 'drain_status'
  • 'entryid'
  • 'enterprise_identity'
  • 'fg_job_id'
  • 'global_uid'
  • 'identification_type'
  • 'is_dg_rolling_upgrade'
  • 'ldap_server_type'
  • 'module'
  • 'network_protocol'
  • 'nls_calendar'
  • 'nls_sort'
  • 'nls_territory'
  • 'oracle_home'
  • 'os_user'
  • 'platform_slash'
  • 'policy_invoker'
  • 'proxy_enterprise_identity'
  • 'proxy_user'
  • 'proxy_userid'
  • 'scheduler_job'
  • 'session_edition_id'
  • 'session_edition_name'
  • 'sessionid'
  • 'statementid'
  • 'terminal'
  • 'unified_audit_sessionid'
  • 'session_default_collation'
  • 'client_info'
  • 'bg_job_id'
  • 'client_program_name'
  • 'current_bind'
  • 'global_context_memory'
  • 'host'
  • 'current_sqln'