单行函数
| Oracle数据库 | GaussDB数据库 |
|---|---|
| 支持,有差异 | |
| 支持,有差异 | |
| 支持,有差异 | |
| 字符集函数 | 不支持 |
| Collation函数 | 不支持 |
| 支持,有差异 | |
| 支持,有差异 | |
| 支持,有差异 | |
| 支持,有差异 | |
| 集合函数 | 不支持 |
| 支持 | |
| 数据挖掘功能函数 | 不支持 |
| 支持,有差异 | |
| 支持,有差异 | |
| 支持,有差异 | |
| 支持 | |
| 支持,有差异 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| ABS | 支持 | - |
| ACOS | 支持,有差异 | 当参数为BINARY_DOUBLE或BINARY_FLOAT类型且值的范围不在-1~1之间时,GaussDB报错,Oracle返回NaN。 |
| ASIN | 支持,有差异 | 当参数为BINARY_DOUBLE或BINARY_FLOAT类型且值的范围不在-1~1之间时,GaussDB报错,Oracle返回NaN。 |
| ATAN | 支持 | - |
| ATAN2 | 支持,有差异 | 两个参数都为0时,GaussDB返回0,Oracle报错。 |
| BITAND | 支持,有差异 |
|
| CEIL | 支持 | - |
| COS | 支持,有差异 |
|
| COSH | 支持,有差异 | 返回值数据类型和精度不同。 GaussDB:当输入是numeric时,返回numeric类型;当输入是其他类型时,返回float8类型,结果精度保留15位有效数字。 Oracle:返回值类型是number。 |
| EXP | 支持 | - |
| FLOOR | 支持 | 返回值类型不同: Gaussdb:
Oracle:
|
| LN | 支持 | 返回值不同:
|
| LOG | 支持 | 入参类型不同:
|
| MOD | 支持,有差异 |
|
| NANVL | 支持,有差异 | GaussDB不支持直接声明或浮点数除0得到NaN。 |
| POWER | 支持,有差异 | 返回值数据类型不同。 GaussDB:
Oracle: 返回值类型是number。 |
| REMAINDER | 支持,有差异 | 返回值数据类型不同。 GaussDB:
Oracle: 返回值类型是number。 返回结果不一致:
|
| ROUND | 支持,有差异 |
|
| SIGN | 支持,有差异 | 返回值数据类型不同。 GaussDB:当输入是numeric时,返回numeric类型,否则返回float8类型。 Oracle:返回值类型是number。 |
| SIN | 支持,有差异 |
|
| SINH | 支持,有差异 | 返回值数据类型和精度不同。 GaussDB:当输入是numeric时,返回numeric类型;当输入是其他类型时,返回float8类型,结果精度保留15位有效数字。 Oracle:返回值类型是number。 |
| SQRT | 支持 | - |
| TAN | 支持,有差异 |
|
| TANH | 支持,有差异 | 返回值数据类型和精度不同。 GaussDB:当输入是numeric时,返回numeric类型;当输入是其他类型时,返回float8类型,结果精度保留15位有效数字。 Oracle:返回值类型是number。 |
| TRUNC | 支持 | 入参类型不同:
返回值类型不同:
|
| WIDTH_BUCKET | 支持 | 入参类型不同: GaussDB:
|
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| CHR | 支持,有差异 |
|
| CONCAT | 支持,有差异 |
|
| INITCAP | 支持,有差异 | 返回值受限于数据库字符集,导致返回结果与Oracle数据库不一致。当入参为EMPTY_CLOB()时,GaussDB返回空字符串;Oracle返回null。 |
| LOWER | 支持,有差异 |
|
| LPAD | 支持,有差异 |
|
| LTRIM | 支持,有差异 |
|
| NCHR | 支持,有差异 |
|
| NLS_LOWER | 支持,有差异 |
|
| NLS_UPPER | 支持,有差异 |
|
| NLSSORT | 支持 | - |
| REGEXP_REPLACE | 支持,有差异 |
|
| REGEXP_SUBSTR | 支持,有差异 |
|
| REPLACE | 支持,有差异 |
|
| RPAD | 支持,有差异 |
|
| RTRIM | 支持,有差异 |
|
| SUBSTR | 支持,有差异 |
|
| TRANSLATE | 支持,有差异 | 当源字符串为EMPTY_CLOB()时,GaussDB返回空字符串;Oracle返回null。 |
| TRIM | 支持,有差异 |
|
| UPPER | 支持,有差异 |
|
| REVERSE | 支持,有差异 |
|
| INSTRB | 支持 | - |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| ASCII | 支持,有差异 |
|
| INSTR | 支持,有差异 |
|
| LENGTH | 支持,有差异 | 返回值类型不同,Oracle返回numeric,GaussDB返回int。 |
| LENGTHB | 支持,有差异 | GaussDB仅支持文本字符串类型入参,不接受BLOB类型;Oracle支持BLOB类型入参。 |
| REGEXP_COUNT | 支持,有差异 |
|
| REGEXP_INSTR | 支持,有差异 |
|
| REGEXP_LIKE | 支持,有差异 |
|
| LENGTHC | 支持 | - |
| DUMP | 支持,有差异 |
|
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| ADD_MONTHS | 支持,有差异 |
|
| CURRENT_DATE | 支持,有差异 |
|
| CURRENT_TIMESTAMP | 支持,有差异 | Oracle数据库参数支持范围(0 ~ 9)。 GaussDB支持范围(0 ~ 6),微秒末位零不显示。 |
| DBTIMEZONE | 支持,有差异 | GaussDB不支持自带tz的timestamp类型接口的调用。 |
| EXTRACT | 支持 | - |
| LAST_DAY | 支持,有差异 | GaussDB存在入参为datea类型和timestamp类型的两个重载函数,当输入字符类型字面量时,GaussDB会优先选择timestamp的重载函数,而Oracle只存在入参为date类型的函数。 |
| LOCALTIMESTAMP | 支持,有差异 | Oracle数据库参数支持范围(0 ~ 9)。 GaussDB支持范围(0 ~ 6),微秒末位零不显示。 |
| MONTHS_BETWEEN | 支持,有差异 | GaussDB存在入参为datea类型和timestamp类型的两个重载函数,当输入字符类型字面量时,GaussDB会优先选择timestamp的重载函数,而Oracle只存在入参为date类型的函数。 |
| NEW_TIME | 支持,有差异 | GaussDB存在入参为datea类型和timestamp类型的两个重载函数,当输入字符类型字面量时,GaussDB会优先选择timestamp的重载函数,而Oracle只存在入参为date类型的函数。 |
| NEXT_DAY | 支持 | GaussDB存在入参为datea类型和timestamp类型的两个重载函数,输入字符类型字面量时,GaussDB会优先选择timestamp的重载函数,而Oracle只存在入参为date类型的函数。 |
| NUMTODSINTERVAL | 支持,有差异 | GaussDB不支持dsinterval类型,暂时用interval兼容dsinterval类型。 |
| NUMTOYMINTERVAL | 支持,有差异 |
|
| SESSIONTIMEZONE | 支持,有差异 |
|
| SYS_EXTRACT_UTC | 支持,有差异 | 当入参时间值落在夏令时跳变间隙(DST gap)中时,Oracle数据库报错ORA-01878,GaussDB不报错,以跳变前的时区偏移量为基准计算UTC时间。例如:悉尼时区Australia/Sydney在2024-10-06 02:00:00处于夏令时开始间隙(时钟从02:00 AEST跳至03:00 AEDT),SYS_EXTRACT_UTC(TIMESTAMP '2024-10-06 02:00:00 Australia/Sydney')在Oracle数据库报错,在GaussDB返回2024-10-05 16:00:00(以跳变前偏移量UTC+10计算)。 |
| SYSDATE | 支持,有差异 | 返回值类型不一致。GaussDB中关闭mapping_date_to_datea时,返回值类型为timestamp without time zone;GaussDB中开启mapping_date_to_datea时,返回值类型为datea。Oracle返回值类型为date。 |
| SYSTIMESTAMP | 支持,有差异 |
|
| TO_DSINTERVAL | 支持,有差异 |
|
| TO_TIMESTAMP | 支持,有差异 |
|
| TO_TIMESTAMP_TZ | 支持,有差异 |
|
| TO_YMINTERVAL | 支持,有差异 | GaussDB不支持yminterval类型,暂时用interval兼容yminterval类型。 |
| TRUNC | 支持,有差异 | GaussDB返回的类型与第一个入参的类型保持一致,Oracle始终返回date类型,另外支持指定的format也有区别,具体支持的列表详见时间和日期处理函数和操作符。 |
| TZ_OFFSET | 支持,有差异 |
|
| ROUND | 支持,有差异 | 返回值类型不一致。GaussDB中关闭mapping_date_to_datea时,返回值类型为timestamp without time zone;GaussDB中开启mapping_date_to_datea时,返回值类型为datea。Oracle返回值类型为date。 GaussDB入参可以为字符类型,而Oracle不支持字符类型作为round函数入参。 第二个入参在指定单位为由ISO 8601标准定义的包含日历周的年份,例如iyyy、iy时,Oracle和GaussDB部分年份返回结果存在差异。 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| GREATEST | 支持,有差异 |
|
| LEAST | 支持,有差异 |
|
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| ASCIISTR | 支持 | - |
| CAST | 支持,有差异 |
|
| HEXTORAW | 支持 | - |
| RAWTOHEX | 支持,有差异 | 当函数入参为数值类型(包括整型、浮点型等)、时间类型(DATEA、TIMESATMP等)时,函数返回结果不一致。 -- Oracle
SQL> SELECT RAWTOHEX(1), RAWTOHEX(1.12) FROM DUAL;
RAWT RAWTOH
---- ------
C102 C1020D
SQL> SELECT RAWTOHEX(TO_DATE('1970-01-01', 'YYYY-MM-DD')) FROM DUAL;
RAWTOHEX(TO_DATE
----------------
B207010100000000
-- GaussDB
gaussdb=# SELECT RAWTOHEX(1), RAWTOHEX(1.12) FROM DUAL;
rawtohex | rawtohex
----------+----------
31 | 312e3132
(1 row)
gaussdb=# SELECT RAWTOHEX(TO_DATE('1970-01-01', 'YYYY-MM-DD')) FROM DUAL;
rawtohex
--------------------
30312d4a414e2d3730
(1 row) |
| TO_BINARY_DOUBLE | 支持,有差异 |
-- Oracle
SELECT TO_BINARY_DOUBLE(1e+400) FROM DUAL; -- 字面量阶段超NUMBER范围
-- numeric overflow
SELECT TO_BINARY_DOUBLE(LPAD('9', 4000, '9')) FROM DUAL; -- 字符串解析阶段超长度
invalid number
SELECT TO_BINARY_DOUBLE(-2.2250738585072014E-308) FROM DUAL;
-- 0
-- GaussDB
gaussdb=# SET a_format_version='10c';
SET
gaussdb=# SET a_format_dev_version='s2';
SET
gaussdb=# SELECT TO_BINARY_DOUBLE(1e+400) FROM DUAL;
to_binary_double
------------------
Infinity
(1 row)
gaussdb=# SELECT TO_BINARY_DOUBLE(LPAD('9', 4000, '9')) FROM DUAL;
to_binary_double
------------------
Infinity
(1 row)
gaussdb=# SELECT TO_BINARY_DOUBLE(-2.2250738585072014E-308) FROM DUAL;
to_binary_double
-----------------------
-2.2250738585072e-308
(1 row)
|
| TO_BINARY_FLOAT | 支持,有差异 |
|
| TO_BLOB | 支持,有差异 |
|
| TO_CLOB | 支持,有差异 | GaussDB不支持BLOB类型作为入参,Oracle支持。 |
| TO_DATE | 支持,有差异 |
|
| TO_MULTI_BYTE | 支持 | - |
| TO_NCHAR | 支持,有差异 |
其余差异请参见TO_CHAR函数。 |
| TO_NUMBER | 支持,有差异 | GaussDB不支持NLS_PARAM参数。 GaussDB不支持CLOB类型作为入参,Oracle支持。 GaussDB与Oracle的format选项差异点描述:
|
| TO_CHAR | 支持,有差异 |
|
| TO_SINGLE_BYTE | 支持 | - |
| TREAT | 支持,有差异 | GaussDB不支持使用“.”操作符取值,不支持转化为object类型。 |
| UNISTR | 支持,有差异 | GaussDB只支持UTF-8编码,Oracle数据库支持UTF-8和UTF-16编码。 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| EMPTY_BLOB | 支持 | - |
| EMPTY_CLOB | 支持,有差异 | GaussDB的CLOB类型不支持Oracle数据库中的定位器概念。 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| SYS_CONNECT_BY_PATH | 支持,有差异 | GaussDB中第一个入参指定的列的类型仅支持CHAR/VARCHAR/NVARCHAR2/TEXT/INT1/INT2/INT4/INT8/FLOAT4/FLOAT8/NUMERIC类型。当前该函数col输入不支持表达式输入,列内容与separator分隔符重复不支持报错。 |
| CONNECT_BY_ROOT | 支持,有差异 | 在GaussDB中,对于CONNECT_BY_ROOT运算存在以下语法限制:若其后指定的列名为非保留关键字时,则必须通过括号将列名进行包裹(如CONNECT_BY_ROOT(column_name))才能为该表达式赋予别名,直接使用无括号形式会导致语法错误。如:CONNECT_BY_ROOT unreserved_keyword_column_name AS alias_name需要修改为CONNECT_BY_ROOT (unreserved_keyword_column_name) AS alias_name。 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| EXISTSNODE | 支持,有差异 | 在入参有命名空间时,xpath和命名空间都需要定义别名。 |
| EXTRACTVALUE | 支持,有差异 | 目前仅支持xpath1.0版本。 |
| SYS_XMLAGG | 支持,有差异 | xmlagg的别名,可使用xmlagg代替。 |
| XMLAGG | 支持,有差异 | 具体差异如说明所示。 |
| XMLCOMMENT | 支持,有差异 | |
| XMLCONCAT | 支持,有差异 | |
| XMLELEMENT | 支持,有差异 | xmlelement和xmlattributes的name字段赋值为NULL时,行为与Oracle不一致。
|
| XMLEXISTS | 支持,有差异 | GaussDB入参为xml类型。 |
| XMLFOREST | 支持,有差异 | GaussDB返回值为xml类型。 GaussDB不支持EVALNAME语法。 |
| XMLPARSE | 支持,有差异 | GaussDB返回值为xml类型。 GaussDB不支持WELLFORMED语法。 |
| XMLROOT | 支持,有差异 | GaussDB返回值为xml类型。 |
| XMLSERIALIZE | 支持,有差异 | 语法规则规则不同,GaussDB入参需要在value后加上AS type,Oracle可以省略不加。 |
| XMLTABLE | 支持,有差异 | GaussDB:
Oracle:使用XQuery表达式从xml中选取数据。 |
| XMLQUERY | 支持,有差异 | GaussDB:
Oracle:使用XQuery表达式从xml中选取数据。 |
| XMLCAST | 支持,有差异 | GaussDB支持的数据类型中,部分数据类型由于与Oracle数据库支持的数据类型本身存在差异,输出的数据格式以及精度上会有差异。 |
| GETSTRINGVAL | 支持,有差异 | 具体差异如说明所示。 |
| GETCLOBVAL | 支持,有差异 | |
| XMLSEQUENCE | 支持,有差异 |
- 由于表9中罗列的XML类型函数基于libxml2实现,因此在部分场景下与Oracle存在行为差异,主要体现在XML解析、特殊字符转义规则以及XPath查询结果格式等方面。
以下示例展示了同一XML查询在GaussDB与Oracle中输出的差异:
GaussDB中的ORA兼容模式下:gaussdb=# SELECT * FROM xmltable('/' passing xmltype('<a>< > " & '</a>')); column_value ---------------------------- <a>< > " & '</a>+ (1 row)Oracle:SQL> SELECT * FROM xmltable('/' passing xmltype('<a>< > " & '</a>')); COLUMN_VALUE -------------------------------------------------------------------------------- <a>< > " & '</a> - GaussDB所依赖的libxml2库版本升级时,可能引入不兼容变更。
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| JSON_ARRAY | 支持,有差异 | GaussDB:入参为可变参数列表([VARIADIC "any"])。 Oracle:入参更复杂,为( expr [ FORMAT JSON ] [, expr [ FORMAT JSON ] ]... [ JSON_on_null_clause ] [ JSON_returning_clause ] [ STRICT ] )。 |
| JSON_OBJECT | 支持,有差异 | GAUSSDB:支持函数JSON_OBJECT([key, val[, key1, val1] ...]),key重复时,保留第一组key-value。 Oracle:入参更复杂,为( key_name VARCHAR2, value_expr [, key_name VARCHAR2, value_expr ]... [ JSON_on_null_clause ] [ JSON_returning_clause ] [ STRICT ] )。支持显式的键值对配对、独立的NULL值处理策略(如ABSENT ON NULL或NULL ON NULL)、返回类型控制以及严格模式(STRICT,防止键名重复或类型不匹配,未指定时如果存在重复key,默认全部保留)。 |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| DECODE | 支持,有差异 | 条件表达式比较时,如果一侧为定长字符类型,另一侧为变长字符类型,GaussDB会忽略尾部空格(与比较操作符行为一致),Oracle不会忽略尾部空格。 |
| DUMP | 支持,有差异 | 因存储格式不同,GaussDB中数值和时间类型的返回结果和Oracle数据库不一致。如:
|
| ORA_HASH | 支持,有差异 | GaussDB中有以下行为:
|
| VSIZE | 支持,有差异 |
|
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| COALESCE | 支持 | - |
| LNNVL | 支持 | - |
| NULLIF | 支持,有差异 | 表达式比较时,如果一侧为定长字符类型,另一侧为变长字符类型,GaussDB会忽略尾部空格(与比较操作符行为一致),Oracle不会忽略尾部空格。 |
| NVL | 支持,有差异 | 第一个表达式为NULL时,GaussDB返回类型为text,Oracle返回第二个表达式的数据类型。 |
| NVL2 | 支持 | - |
| Oracle数据库 | GaussDB数据库 | 差异 |
|---|---|---|
| SYS_CONTEXT | 支持,有差异 |
|
| SYS_GUID | 支持 | - |
| USER | 支持,有差异 | 返回值类型不一致。 |
| USERENV | 支持,有差异 | GaussDB对不支持的参数返回NULL。 以下为不支持的参数列表:
|