delete oracle and jdbc doc (#332)
This commit is contained in:
parent
3a9172e384
commit
f57b05e001
@ -1,120 +0,0 @@
|
||||
SQL 概述
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
结构化查询语言(Structured Query Language)简称 SQL,是一种有特殊目的的编程语言。和当下流行的其他关系数据库一样,所有程序和用户都可以使用 SQL 来访问 OceanBase 数据库中的数据。即便有一些平台、工具允许用户直接通过接口或界面的方式访问数据库,但这些平台、工具底层实际上依旧是使用 SQL 来访问数据库。
|
||||
|
||||
SQL 的历史
|
||||
-------------------
|
||||
|
||||
1970 年 6 月,IBM 公司 San Jose,California 实验室的 E. F. Codd 博士在 ACM(Association for Computing Machinery)期刊上发表了论文《大型共享数据银行的关系模型》(A Relational Model of Data for Large Shared Data Banks)并首次提出了关系模型的概念。
|
||||
|
||||
1974 年,同实验室的 D.D.Chamberlin 和 R.F.Boyce 在 IBM 公司研制的关系数据库系统 SystemR 中,研制出了一套规范语言 SEQUEL(Structured English QUEry Language),并在 1976 年 11 月的 IBM Journal of R\&D 上公布了新版本的 SQL(称为 SEQUEL/2,1980年改名为 SQL)。
|
||||
|
||||
1979 年,Oracle 公司首先提供商用的 SQL,同时 IBM 公司在 DB2 和 SQL/DS 数据库系统中也实现了 SQL。
|
||||
|
||||
时至今日,SQL 已经成为了关系数据库管理系统(Relational Database Management System:RDBMS)的标准语言。
|
||||
|
||||
SQL 的标准
|
||||
-------------------
|
||||
|
||||
1986 年 10 月,美国国家标准协会 ANSI 采用 SQL 作为关系数据库管理系统的标准语言,并命名为 ANSI X3. 135-1986,后来国际标准化组织(ISO)也采纳 SQL 作为国际标准。
|
||||
|
||||
1989 年,ANSI 采纳并使用了在 ANSI X3.135-1989 报告中定义的 SQL 标准语言,并称之为 ANSI SQL 89,该标准替代了之前的 ANSI X3.135-1986 版本。
|
||||
|
||||
下面是 SQL 发展的简要历史:
|
||||
|
||||
* 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86。
|
||||
|
||||
|
||||
|
||||
* 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89。
|
||||
|
||||
|
||||
|
||||
* 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)。
|
||||
|
||||
|
||||
|
||||
* 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)。
|
||||
|
||||
|
||||
|
||||
* 2003年,ISO/IEC 9075:2003,SQL:2003。
|
||||
|
||||
|
||||
|
||||
* 2008年,ISO/IEC 9075:2008,SQL:2008。
|
||||
|
||||
|
||||
|
||||
* 2011年,ISO/IEC 9075:2011,SQL:2011。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
现在,绝大多数被提及的 SQL 标准,其中涉及的内容其实都是 SQL 92 里最基本、最核心的一部分。OceanBase 目前也遵循的是 SQL 92 标准。
|
||||
|
||||
SQL 的运行
|
||||
-------------------
|
||||
|
||||
SQL 是用来访问关系数据库,如 OceanBase、Oracle 和 MySQL 的接口,所有的 SQL 语句都是对数据库的指令。
|
||||
|
||||
通常,SQL 可以分为 5 个部分:
|
||||
|
||||
1. 数据查询语言 DQL(Data Query Language):也称为数据检索语言,用以从表中获得数据,并描述怎样将数据返回给程序输出。DQL 并不改变数据库中存储的数据内容。
|
||||
|
||||
|
||||
|
||||
2. 数据操作语言 DML(Data Manipulation Language):用以改变数据库中存储的数据内容,即增加、修改和删除数据。
|
||||
|
||||
|
||||
|
||||
3. 事务控制语言 TCL(Transaction Control Language):保证数据库的完整性、一致性,在同一个事务中的 DML 语句要么同时成功,要么同时失败。
|
||||
|
||||
|
||||
|
||||
4. 数据控制语句 DCL(Data Control Language):对数据访问权限控制的命令。可以控制特定账号对特定数据库资源的访问权限。
|
||||
|
||||
|
||||
|
||||
5. 数据定义语言 DDL(Data Definition Language):对数据库中资源进行定义、修改和删除,如新建表和删除表等。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SQL 的移植性
|
||||
--------------------
|
||||
|
||||
SQL 是访问数据库的标准语言,所有的主要关系数据库都支持 SQL,因此所有用 SQL 编写的程序都是可移植的。通常进行少量的修改就可以从一个关系数据库移植到另一个关系数据库上。
|
||||
|
||||
词汇惯例
|
||||
----------------
|
||||
|
||||
* **粗体** 表示与操作或以文本或词汇表定义的术语相关联的图形用户界面元素。
|
||||
|
||||
* 保留字、关键字、标识符和参数中的大小写不敏感。为方便阅读与识别,这些字会以大写形式书写。
|
||||
|
||||
|
||||
|
||||
* 在不同的编程环境中,SQL 语句终止方式不同。本文档中以分号 ";" 来标识一个 SQL 的结尾。
|
||||
|
||||
|
||||
|
||||
* `行内代码` 表示文档中引用的代码。
|
||||
|
||||
* 为了突出重要信息,本文档会加粗"说明"、"注意"和"重要"等文字。
|
||||
|
||||
|
||||
|
||||
* 本文档中可选参数文本用方括号括起,如 \[-n, -quiet\]。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,225 +0,0 @@
|
||||
伪列
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
伪列(Pseudocolumn)的行为与表中的列相同,但并未存储具体数值。因此,伪列只具备读属性,您不可以对伪列进行插入、更新、删除的等行为。
|
||||
|
||||
层次查询伪列
|
||||
------------------
|
||||
|
||||
层次查询伪列仅在层次查询中有效,要在查询中定义层次结构关系,必须使用 `CONNECT BY` 子句。
|
||||
|
||||
### CONNECT_BY_ISCYCLE 伪列
|
||||
|
||||
`CONNECT_BY_ISCYCLE` 伪列用来协助标记循环是从哪一行开始的。如当前行的子节点同时也是其祖先节点之一,则`CONNECT_BY_ISCYCLE` 返回 1,否则返回 0。
|
||||
|
||||
`CONNECT_BY_ISCYCLE` 需要配合 `CONNECT BY` 子句的 `NOCYCLE` 使用,否则查询结果会因树状结果存在循环而报错。
|
||||
|
||||
### CONNECT_BY_ISLEAF 伪列
|
||||
|
||||
`CONNECT_BY_ISLEAF` 伪列用来协助标记层次结构的叶子节点。如当前行无子节点即为树的叶子节点时,返回 1,否则返回 0。
|
||||
|
||||
### LEVEL 伪列
|
||||
|
||||
`LEVEL` 伪列用来协助标记节点的层次。层次结构中,根为第 1 层,根的子结点为第 2 层,之后以此类推。例如,根节点的 `LEVEL` 值会返回 1,根节点的子节点的 `LEVEL` 值会返回 2,之后以此类推。
|
||||
|
||||
序列伪列
|
||||
----------------
|
||||
|
||||
序列(Sequence)伪列是数据库按照一定规则生成的自增数字序列。因其自增的特性,通常被用作主键和唯一键。序列伪列有两种取值方法:
|
||||
|
||||
* `CURRVAL`:返回序列的当前值。
|
||||
|
||||
* `NEXTVAL`:返回序列的下一个自增值。
|
||||
|
||||
|
||||
|
||||
|
||||
使用序列伪列时,必须在 `CURRVAL`、`NEXTVAL` 前带上序列的名称,并用句点(.)引用。例如,序列的名称为 **SEQ_FOO** ,则可以通过 `SEQ_FOO.CURRVAL` 获取 **SEQ_FOO** 序列的当前值。同样,可以通过 `SEQ_FOO.NEXTVAL` 获取 **SEQ_FOO** 序列的下一个自增值。
|
||||
|
||||
### 序列伪列的应用场景
|
||||
|
||||
序列伪列 `CURRVAL` 和 `NEXTVAL` 的值可以用于以下位置:
|
||||
|
||||
* 非子查询、物化视图或者视图中的 `SELECT` 语句的选择列表中。
|
||||
|
||||
|
||||
|
||||
* `INSERT` 语句中子查询的选择列表中。
|
||||
|
||||
* `INSERT` 语句中的 `VALUE` 子句中。
|
||||
|
||||
* `UPDATE` 语句中的 `SET` 子句中。
|
||||
|
||||
|
||||
|
||||
|
||||
序列伪列 `CURRVAL` 和 `NEXTVAL` 的值不能用于以下位置:
|
||||
|
||||
* `DELETE`、`SELECT` 或者 `UPDATE` 语句的子查询中。
|
||||
|
||||
* 视图或者物化视图的查询中。
|
||||
|
||||
|
||||
|
||||
* 带 `DISTINCT` 运算符的 `SELECT` 语句中。
|
||||
|
||||
|
||||
|
||||
* 带 `GROUP BY` 子句或者 `ORDER BY` 子句的 `SELECT` 语句中。
|
||||
|
||||
|
||||
|
||||
* 与另一个 `SELECT` 语句通过 `UNION`、`INTERSECT` 或者 `MINUS` 集合运算符进行联合的 `SELECT` 语句中。
|
||||
|
||||
|
||||
|
||||
* `SELECT` 语句的 `WHERE` 子句中。
|
||||
|
||||
* `CREATE TABLE` 或者 `ALTER TABLE` 语句中列的 `DEFAULT` 值。
|
||||
|
||||
* `CHECK` 约束的条件中。
|
||||
|
||||
|
||||
|
||||
|
||||
### 如何使用序列伪列
|
||||
|
||||
创建序列时,需要明确其初始值和步长。第一次引用 `NEXTVAL` 将返回序列的初始值,后续对 `NEXTVAL` 的引用将按照上一次序列的返回值加上序列定义的步长后返回一个新值。任何时候对 `CURRVAL` 的引用,都将返回当前序列的值,即最后一次对 `NEXTVAL` 引用时返回的值。
|
||||
|
||||
在会话中引用序列的 `CURRVAL` 伪列前,都应首先应用序列的 `NEXTVAL` 伪列来初始化本次会话的序列值。
|
||||
|
||||
创建序列时,可以定义其初始值以及其值之间的增量。对 `NEXTVAL` 的第一次引用将返回序列的初始值。对 `NEXTVAL` 的后续引用将会使序列值按照定义的增量递增,并返回新值。任何对 `CURRVAL` 的引用总是返回该序列的当前值,即最后一次对 `NEXTVAL` 引用时返回的值。对序列的创建的相关内容,请参考文档 [CREATE SEQUENCE](../11.sql-reference-oracle-mode/9.sql-statement-1/1.DDL-1/12.create-sequence.md) 章节。
|
||||
|
||||
在单条 SQL 语句中引用 `NEXTVAL` 时,OceanBase 数据库按照以下方式递增序列:
|
||||
|
||||
* `SELECT` 语句的外部查询块每返回一行递增一次。这类查询块可以出现在以下地方:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `UPDATE` 语句每更新一行序列就递增一次。
|
||||
|
||||
* 每有一条包含 `VALUES` 子句的 `INSERT` 语句就递增一次。
|
||||
|
||||
|
||||
|
||||
* `MERGE` 语句每合并一行序列递增一次。`NEXTVAL` 可以出现在 `merge_insert_clause` 或者`merge_update_clause` 子句中,也可两者同时出现。`NEXTVAL` 会随着每一行的更新和插入而递增,即使序列数值没有用于更新或者插入操作。如果 `NEXTVAL` 在这些位置中被指定了多次,那么对应每一行都递增一次序列,而且该行中出现的所有 `NEXTVAL` 都返回相同的值。
|
||||
|
||||
|
||||
|
||||
|
||||
当这些位置多次引用一个序列的 `NEXTVAL` 伪列时,该序列都只递增一次,即为所有被引用的 `NEXTVAL` 伪列返回当前序列的下一个序列值。
|
||||
|
||||
当这些位置同时引用一个序列的 `CURRVAL` 和 `NEXTVAL` 伪列时,OceanBase 将递增该序列,即为被引用的 `CURRVAL` 和 `NEXTVAL` 伪列都返回当前序列的下一个序列值。
|
||||
|
||||
序列可以同时被许多用户访问,不存在等待和锁定。
|
||||
|
||||
ROWSCN 伪列
|
||||
---------------------
|
||||
|
||||
`ORA_ROWSCN` 伪列将最新更改的系统更改号(SCN:System Change Number)反映到一行,该更改号表示这一行数据修改所在事务的提交时间。
|
||||
|
||||
ROWNUM 伪列
|
||||
---------------------
|
||||
|
||||
`ROWNUM` 伪列会对查询结果中的每一行进行编号,其值为该行在查询结果集中的具体位置。第一行返回值 1,第二行返回值 2,之后以此类推。
|
||||
|
||||
ROWNUM 的用法说明
|
||||
------------------------
|
||||
|
||||
`ROWNUM` 可以限制返回的行数,例如以下示例,将返回 **employees** 表中的 5 条数据:
|
||||
|
||||
```sql
|
||||
SELECT * FROM employees WHERE rownum <=5;
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果在 `ROWNUM` 后有 `ORDER BY` 子句,则将对满足 `WHERE` 条件句的结果进行重排序。如果将 `ORDER BY` 子句嵌入子查询中,并将 `ROWNUM` 伪列作为条件放置在顶级查询中,则可以强制 `ROWNUM` 条件在行排序之后执行。例如,使用以下语句查询年龄最大的 5 名员工信息是得不到预期结果的,该语句只是将查询结果中的前 5 条员工信息进行年龄排序:
|
||||
|
||||
```sql
|
||||
SELECT * FROM employees WHERE rownum <=5 ORDER BY age DESC;
|
||||
```
|
||||
|
||||
|
||||
|
||||
正确的用法应该如下:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM (SELECT * FROM employees ORDER BY age DESC) WHERE rownum <= 5;
|
||||
```
|
||||
|
||||
|
||||
|
||||
在 `WHERE` 子句中,指定 `ROWNUM` 大于任何一个正整数时总是返回 **FALSE** ,例如以下 SQL 语句将不返回任何信息:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM employees WHERE rownum > 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
因为在获得表的第一行结果时,改行的 `ROWNUM` 伪列值将被赋值为 1,此时在 `WHERE` 条件判断时结果为 **FALSE** ,则此行被舍去。在获得第二行结果时,该行的 `ROWNUM` 伪列值任然被赋值为 1,`WHERE` 条件判断的结果依旧为 **FALSE** ,此行再次被舍去。以此类推,所以所有行都不满足条件,因此不返回任何数据。
|
||||
|
||||
也可以通过 `UPDATE` 语句将`ROWNUM` 数值赋值给表中的某一列,例如:
|
||||
|
||||
```javascript
|
||||
UPDATE employees SET id = rownum;
|
||||
```
|
||||
|
||||
|
||||
|
||||
此语句将对表 **employees** 的 **id** 列进行 `ROWNUM` 赋值,即依次对 **id** 列赋值 1、2、... 直至该表总行数。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
在查询中使用 `ROWNUM` 可能会影响视图优化。
|
||||
|
||||
ROWID 伪列
|
||||
-----------------------------
|
||||
|
||||
ROWID 伪列提供了快速定位表中某一行的能力,ROWID 值由主键编码得到,不会进行实际的存储,类型是 UROWID。使用方法如下:
|
||||
|
||||
1. 从 employees 表中查询到 ROWID 值
|
||||
|
||||
```sql
|
||||
obclient> SELECT ROWID, last_name FROM employees WHERE department_id = 20;
|
||||
+-------------------+-----------+
|
||||
| ROWID | LAST_NAME |
|
||||
+-------------------+-----------+
|
||||
| *AAIKAQAAAAAAAAA= | xxx |
|
||||
+-------------------+-----------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 使用 ROWID 值进行 update 操作
|
||||
|
||||
```sql
|
||||
obclient> UPDATE employees SET last_name = 'yyy' WHERE ROWID = '*AAIKAQAAAAAAAAA=';
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
Rows matched: 1 Changed: 1 Warnings: 0
|
||||
|
||||
obclient> select last_name, department_id from employees;
|
||||
+-----------+---------------+
|
||||
| LAST_NAME | DEPARTMENT_ID |
|
||||
+-----------+---------------+
|
||||
| yyy | 20 |
|
||||
+-----------+---------------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,41 +0,0 @@
|
||||
内建数据类型概述
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
OceanBase 数据库操作的每个值都有一个数据类型。值的数据类型将一组固定的属性与值相关联,这些属性使 OceanBase 将一种数据类型的值与另一种数据类型的值区别对待。OceanBase 数据库提供了许多内建数据类型, 这些内建数据类型也称 OceanBase 基本数据类型。
|
||||
|
||||
数据类型
|
||||
-------------------------
|
||||
|
||||
OceanBase 支持如下数据类型,与 Oracle 数据类型保持一致:
|
||||
|
||||
* 字符数据类型
|
||||
|
||||
|
||||
|
||||
* 数值数据类型
|
||||
|
||||
|
||||
|
||||
* 日期时间类型
|
||||
|
||||
|
||||
|
||||
* RAW 数据类型
|
||||
|
||||
|
||||
|
||||
* 大对象数据类型
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,27 +0,0 @@
|
||||
字符数据类型概述
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
字符数据类型在数据库字符集或国家字符集中存储字符(字母数字)数据,即单词和自由格式的文本。字符数据类型与其他数据类型相比具有限制性,因此属性较少。
|
||||
|
||||
字符数据存储在字符串中,其字节值与创建数据库时指定的字符集之一相对应。OceanBase 支持单字节和多字节字符集。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
字符数据类型的列可以存储所有字母数字值,但是 `NUMBER` 数据类型的列只能存储数字值。
|
||||
|
||||
|
||||
|
||||
|
||||
| **数据类型** | **长度** | **使用说明** | **长度说明** |
|
||||
|---------------------------------|--------|------------------------------------------|--------------------------------------------------------------------|
|
||||
| CHAR(size \[BYTE \| CHAR\]) | 定长 | 索引效率高,程序里面使用 `trim` 去除多余的空白。 | 参数 `size` 必须是一个介于 1\~2000 之间的数值,存储大小为 `size` 个字节。 |
|
||||
| NCHAR\[(size)\] | 定长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示) 。 | 参数 `size` 必须是一个介于 1\~2000 之间的数值,存储大小为 `size` 字节的两倍。 |
|
||||
| NVARCHAR2(size) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 `size` 的值必须介于 1\~32767 之间,字节的存储大小是所输入字符个数的两倍。 |
|
||||
| VARCHAR2(size \[BYTE \| CHAR\]) | 变长 | 使用 UNICODE 字符集(所有的字符使用两个字节表示)。 | 参数 `size` 必须是一个介于 1\~32767 之间的数值,存储大小为输入数据的字节的实际长度,而不是 `size` 个字节。 |
|
||||
| VARCHAR(size \[BYTE \| CHAR\]) | 变长 | OceanBase 中 `VARCHAR` 和 `VARCHAR2` 没有区别。 | 参数 `size` 必须是一个介于 1\~32767 之间的数值,存储大小为输入数据的字节的实际长度,而不是 `size` 个字节。 |
|
||||
|
||||
|
||||
其中,`CHAR` 和 `VARCHAR2` 数据类型需要指定 `length` 语义,其默认值由系统变量 `NLS_LENGTH_SEMANTICS` 控制。
|
@ -1,54 +0,0 @@
|
||||
CHAR 数据类型
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`CHAR` 数据类型指定了固定长度的字符串。OceanBase 确保存储在 `CHAR` 数据类型列中的所有值的长度等于 `size` 指定的固定长度。如果您插入的值短于指定长度,则 OceanBase 将用空格填充剩余长度。如果您插入的值超过列长度,则 OceanBase 会返回错误。
|
||||
|
||||
`BYTE` 和 `CHAR` 限定符会覆盖由 `NLS_LENGTH_SEMANTICS` 参数指定的语义,而该参数默认字节语义。为了确保具有不同字符集的数据库之间,能够进行正确的数据转换,`CHAR` 数据必须由格式正确的字符串组成。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
CHAR [(size [BYTE | CHAR])]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|----------------------|
|
||||
| size | 表示指定的固定长度 |
|
||||
| BYTE | 表示以字节(BYTE)为单位提供列的长度 |
|
||||
| CHAR | 表示以字符(CHAR)为单位提供列的长度 |
|
||||
|
||||
|
||||
`CHAR` 数据类型的列的默认长度为 1 个字节,允许的最大长度为 2000 个字节。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
当创建带有 `CHAR` 数据类型列的表时,默认情况下,您以字节为单位提供列的长度。`BYTE` 与默认值相同。
|
||||
|
||||
如果使用 `CHAR` 限定符。则以字符为单位提供列长。
|
||||
|
||||
* **示例 1**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
将一个 1 字节的字符串插入 `CHAR(10)` 类型的列中,在存储该字符串之前,将为其空白填充为 10 个字节。
|
||||
|
||||
* **示例 2**
|
||||
|
||||
|
||||
|
||||
|
||||
`CHAR(10 CHAR)`,表示以字符为单位提供列长。
|
@ -1,83 +0,0 @@
|
||||
NCHAR 数据类型
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
`NCHAR` 是 `UNICODE` 字符数据类型,长度固定。您在创建数据库时,列的最大长度由国家字符集定义确定。创建包含 `NCHAR` 数据类型列的表时,以字符定义列长度。字符数据类型 `NCHAR` 的宽度规范是指字符数。允许的最大列大小为 2000 字节。
|
||||
|
||||
如果希望用较少的空间来存储中文,可以选择 `NCHAR` 类型。
|
||||
|
||||
使用 `NCHAR` 来存储数据时,如果存储的数据没有达到指定长度,那么数据库将自动补足空格。指定长度时,采用 `CHAR` 为计量单位,不可以手动指定其他单位。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
您不能将 `CHAR` 值插入 `NCHAR` 列,也不能将 `NCHAR` 值插入 `CHAR` 列。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
NCHAR[(size)]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------|-----------------------------------------------------------------|
|
||||
| `size` | 表示定长字符数据的长度大小,最大大小由国家字符集定义确定,上限为 2000 个字节。默认定长字符数据的长度最小为 1 个字符。 |
|
||||
|
||||
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
### UNICODE 字符集
|
||||
|
||||
UNICODE 字符集是对字符的一种编码,具体的编码方式有 UTF-8、UTF-16、UTF-32 和压缩转换等,编码方式决定了一个字符的存储大小,中英文在不同的存储方式上使用的空间是不一样的。
|
||||
|
||||
**三种编码方式的对比**
|
||||
|
||||
|
||||
| **编码方式** | **编码字节数** | **BOM** | **优点** | **缺点** |
|
||||
|------------|-----------------------------------------------------------|-------------------------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------|
|
||||
| **UTF-8** | 不定长编码方式,单字节(ASCII 字符)或多字节(非 ASCII 字符);最小 Code Unit 是 8 位。 | 无字节序:如果一个文本的开头有字节流 EF BB BF,表示是 UTF-8 编码。 | 较为理想的 UNICODE 编码方式:与 ASCII 编码完全兼容;无字节序;自同步和纠错能力强,适合网络传输和通信;扩展性好。 | 变长编码方式不利于程序内部处理。 |
|
||||
| **UTF-16** | 双字节或者四字节;最小 Code Unit 是 16 位。 | 有字节序:UTF-16LE(小端序)以 FF FE 代表,UTF-16BE(大端序)以 FE FF 代表。 | 最早的 Unicode 编码方式,已被应用于大量环境中;适合内存中 Unicode 处理;很多编程语言的 API 中作为 string 类型的编码方式。 | 无法兼容于 ASCII 编码;增补平面码点编码使用代理对,编码复杂;扩展性差。 |
|
||||
| **UTF-32** | 固定四字节;最小 Code Unit 是 16 位。 | 有字节序:UTF-16LE(小端序)以 FF FE 代表,UTF-16BE(大端序)以 FE FF 代表。 | 固定字节编码读取简单,编译程序内部处理;Unicode 码点和 Code Unit 一一对应关系。 | 所有字符以固定四字节编码,浪费存储空间和带宽;与 ASCII 编码不兼容;扩展性差;实际使用少。 |
|
||||
|
||||
|
||||
|
||||
### 数据库字符集
|
||||
|
||||
* 用来存储 `CHAR`、`VARCHAR2`、`CLOB` 等类型数据。
|
||||
|
||||
|
||||
|
||||
* 用来标示诸如表名、列名以及 PL 变量等。
|
||||
|
||||
|
||||
|
||||
* 用来存储 SQL 和 PL 程序单元等。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 国家字符集
|
||||
|
||||
* 用来存储 `NCHAR`、`NVARCHAR2`、`NCLOB` 等类型数据。
|
||||
|
||||
|
||||
|
||||
* 国家字符集实质上是为 OceanBase 数据库选择的附加字符集,主要作用是为了增强 OceanBase 数据库的字符处理能力,`NCHAR` 数据类型使用国家字符集,在使用 `CHAR` 数据类型提供的数据库字符集的同时,`NCHAR` 类型提供了除了数据库字符集之外的另一种字符集选择。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,29 +0,0 @@
|
||||
NVARCHAR2 数据类型
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
`NVARCHAR2` 是 `UNICODE` 字符数据类型。列的长度可变,最大存储长度为 32767 个字节,最小值为 1 个字节。创建包含 `NVARCHAR2` 数据类型列的表时,您必须为 `NVARCHAR2` 指定可以容纳的最大字符数,默认采用 `CHAR` 为计量单位,不可以手动指定其他单位。
|
||||
|
||||
如果不确定存储的数据长度,而且有可能包含中文,可以选择 `NVARCHAR2` 类型。
|
||||
|
||||
格式
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
NVARCHAR2(size)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|---------------------------------------------------------------------------------------------------------------|
|
||||
| size | 表示列的长度,可变长度。您必须为 `NVARCHAR2` 指定大小,对于 AL16UTF16 编码,字节数最大为两倍,对于 UTF8 编码,字节数最大为三倍。字节数大小由国家字符集定义确定,上限为 32767 个字节。 |
|
||||
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
VARCHAR2 数据类型
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
`VARCHAR2` 数据类型存储一个可变长度的字符串,最大长度为 32767。当您创建 `VARCHAR2` 列时,您必须为 `VARCHAR2` 列指定最大长度。尽管允许存储的实际字符串为零长度字符串(''),但该最大值必须至少为 1 个字节。OceanBase 会将每个值完全按照您指定的方式存储在列中。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
* 从技术上讲,字符是数据库字符集的代码点。
|
||||
|
||||
|
||||
|
||||
* 创建具有该列或属性,且在列或属性定义中未包含任何明确限定词的数据库对象时,长度语义由会话的 `NLS_LENGTH_SEMANTICS` 参数的值决定。
|
||||
|
||||
|
||||
|
||||
* OceanBase 使用未填充的比较语义比较 `VARCHAR2` 值。
|
||||
|
||||
|
||||
|
||||
* 具有不同字符集的数据库之间进行正确的数据转换时,必须确保 `VARCHAR2` 数据由格式正确的字符串组成。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
VARCHAR2(size [BYTE | CHAR])
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|--------------------|
|
||||
| size | 表示存储的字节数或字符数的长度大小。 |
|
||||
| BYTE | 表示该列将具有字节长度的语义。 |
|
||||
| CHAR | 指示该列将具有字符语义。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
您可以使用 `CHAR` 限定符,以字符为单位提供最大长度。
|
||||
|
||||
```javascript
|
||||
VARCHAR2(10 CHAR)
|
||||
```
|
||||
|
||||
|
||||
|
||||
您可以使用 `BYTE` 限定符,以字节为单位明确给出最大长度。
|
||||
|
||||
```javascript
|
||||
VARCHAR2(10 BYTE)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,31 +0,0 @@
|
||||
VARCHAR 数据类型
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
`VARCHAR` 数据类型用于存储可变长度的字符串。当您创建 `VARCHAR` 数据类型的列时,您必须为 `VARCHAR` 列指定最大长度。尽管允许存储的实际字符串为零长度字符串(''),但该最大值必须至少为 1 个字节。OceanBase 会将每个值完全按照您指定的方式存储在列中。如果插入值超过指定长度,OceanBase 会返回错误。
|
||||
|
||||
在 OceanBase 中 `VARCHAR` 数据类型和 `VARCHAR2` 数据类型没有区别,一般会用 `VARCHAR2`。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
VARCHAR(size [BYTE | CHAR])
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|--------------------|
|
||||
| size | 表示存储的字节数或字符数的长度大小。 |
|
||||
| BYTE | 表示该列将具有字节长度的语义。 |
|
||||
| CHAR | 指示该列将具有字符语义。 |
|
||||
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
数值数据类型概述
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
OceanBase 为我们提供了四种存储数值的数据类型,它们分别是 `NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`。您可以通过这四种数值类型存储定点数、浮点数和零。在数值计算时,数值类型具有不同的优先级,具体信息请查阅 [数值类型的优先级](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/3.numeric-data-type/5.numeric-priority.md)。
|
||||
|
||||
|
||||
| **数据类** | **长度(字节)** | **说明** |
|
||||
|---------------|------------|-----------------------------------------------------------------|
|
||||
| NUMBER | 4\~40 | `NUMBER(p,s)` 存储变长、十进制精度的定点数;也可以存储浮点数,此时 `NUMBER` 没有 `p` 和 `s`。 |
|
||||
| FLOAT | 4\~40 | `FLOAT(p)` 是 `NUMBER` 数据类型的子类型。二进制精度范围为 1\~126。`FLOAT` 不是浮点数。 |
|
||||
| BINARY_FLOAT | 4 | 二进制精度浮点数,是一种 32 位单精度浮点数数据类型。 |
|
||||
| BINARY_DOUBLE | 8 | 二进制精度浮点数,是一种 64 位双精度浮点数数据类型。 |
|
||||
|
||||
|
@ -1,99 +0,0 @@
|
||||
NUMBER 数据类型
|
||||
================================
|
||||
|
||||
|
||||
|
||||
`NUMBER` 是变长、精确的数值类型,占 4\~40 字节存储空间,其中 4 字节存放 `NUMBER` 的元数据信息, 36 字节存放 `NUMBER` 的具体数值。可以存储零、浮点数、正的定点数和负的定点数,其绝对值范围 1.0 × 10^-130^ \~ 1.0 × 10^126^(不包括 1.0 × 10^126^)。如果您指定的算术表达式的绝对值大于或等于 1.0 × 10^-130^,OceanBase 会返回错误。
|
||||
|
||||
`NUMBER` 数据类型具有较好的数据精确度、通用性强、可移植性强,运算效率相对浮点类型偏低。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
NUMBER [(p[s])]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 取址范围 | 说明 |
|
||||
|----|----------|---------------------------------------------------|
|
||||
| p | 1\~38 | 表示精度,最大有效十进制数字,其中最高有效数字是最左边的非零数字,最低有效数字是最右边的已知数字。 |
|
||||
| s | -84\~127 | 表示小数位数,从小数点到最低有效数字的位数。比例尺范围是 -84\~127。 |
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* 若 s\>0,精确到小数点右边 `s` 位,四舍五入。然后检验有效位是否小于等于 `p`。
|
||||
|
||||
|
||||
|
||||
* 若 s\<0,精确到小数点左边 `s` 位,四舍五入。然后检验有效位是否小于等于 `p + |s|`。
|
||||
|
||||
|
||||
|
||||
* 若 s=0, 表示整数。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
* 小数位数正标度是小数点右边到最低有效位数(包括最低有效位数)的有效位数。精度和小数位都用十进制数字表示。
|
||||
|
||||
|
||||
|
||||
* 小数位数负数标度是小数点左边的有效位数,但不包括最低有效位数。对于负比例,最低有效数字在小数点的左侧,因为实际数据四舍五入到小数点左侧的指定位数。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
* **示例 1:** 使用以下格式指定整数。
|
||||
|
||||
|
||||
|
||||
|
||||
`NUMBER(p)` 表示精度为 `p` 且标度为 0 的定点数,等效于 `NUMBER(p,0)`。
|
||||
|
||||
`NUMBER` 表示浮点数,缺少精度和小数位数指示符。
|
||||
|
||||
* **示例 2:** 使用不同的精度和小数位数存储数据。为了避免 OceanBase 存储的数据超过精度,我们需要为定点数字列指定小数位数和精度,对输入进行额外的完整性检查。但这不会强制固定定点数字列的长度。若实际存储的数据超过精度,则 OceanBase 会返回错误。如果存储的数据超过小数位数,则 OceanBase 对其进行四舍五入。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
| 实际数据 | 指定为 | 存储为 |
|
||||
|----------|----------------|---------|
|
||||
| 123.89 | `NUMBER` | 123.89 |
|
||||
| 123.89 | `NUMBER(3)` | 124 |
|
||||
| 123.89 | `NUMBER(3,2)` | 超过精度 |
|
||||
| 123.89 | `NUMBER(4,2)` | 超过精度 |
|
||||
| 123.89 | `NUMBER(5,2)` | 123.89 |
|
||||
| 123.89 | `NUMBER(6,1)` | 123.9 |
|
||||
| 123.89 | `NUMBER(6,-2)` | 100 |
|
||||
| .01234 | `NUMBER(4,5)` | .01234 |
|
||||
| .00012 | `NUMBER(4,5)` | .00012 |
|
||||
| .000127 | `NUMBER(4,5)` | .00013 |
|
||||
| .000012 | `NUMBER(2,7)` | .000012 |
|
||||
| .0000123 | `NUMBER(2,7)` | .000012 |
|
||||
| 1.2e-4 | `NUMBER(2,5)` | .00012 |
|
||||
| 1.2e-5 | `NUMBER(2,5)` | .00001 |
|
||||
|
||||
|
||||
|
@ -1,96 +0,0 @@
|
||||
FLOAT 数据类型
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
`FLOAT` 数据类型是具有精度(precision)的 `NUMBER` 数据类型的子类型,需要占 4\~40 字节存储空间。它的精度是按二进制有效位数计算的,范围为 1\~126,小数位数不可自定义。`FLOAT` 类型为变长、非精确数值类型。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
FLOAT [(p)]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 定义 | 范围 | 说明 |
|
||||
|----|----|--------|----------------------------------------|
|
||||
| p | 精度 | 1\~126 | 定义数值精度,按二进制有效位数计算,转换为十进制精度要乘以 0.30103。 |
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* 二进制精度转换为十进制精度的换算关系: `十进制精度 = int(二进制精度 x 0.30103)`。
|
||||
|
||||
|
||||
|
||||
* 十进制精度转换为二进制精度的换算关系: `二进制精度 = int(十进制精度 x 3.32193)`。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
* **示例 1:** 使用 `FLOAT` 设置二进制精度为 2,转换为十进制精度 int(2 x 0.30103) = 0.6,结果向下取整,则 `FLOAT(2)` 的十进制精度为 0。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
FLOAT(2)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **示例 2:** 创建 **test** 表,并向里面插入数据。其中 **col1** 列是 `NUMBER` 类型, **col2** 列是 `FLOAT` 类型。`NUMBER(5,2)` 表示十进制精度的定点数,有效位数为 5,结果保留小数点后 2 位。`FLOAT(5)` 的二进制精度为 5,转换为十进制精度为`int(5 x 0.30103) = 1.50515`,向下取整后十进制精度为 1。如 123.45 用科学计数法表示为 1.2345 x 10^2^,1.2345 小数点后保留 1 位,四舍五入变为 1.2,最后显示为 1.2 x 10^2^ = 120。执行以下语句:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE test (col1 NUMBER(5,2), col2 FLOAT(5));
|
||||
INSERT INTO test VALUES (1.23, 1.23);
|
||||
INSERT INTO test VALUES (7.89, 7.89);
|
||||
INSERT INTO test VALUES (12.79, 12.79);
|
||||
INSERT INTO test VALUES (123.45, 123.45);
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行 SELECT 语句查看 **test** 表,返回结果如下:
|
||||
|
||||
```javascript
|
||||
obclient> SELECT * FROM test;
|
||||
+--------+------+
|
||||
| COL1 | COL2 |
|
||||
+--------+------+
|
||||
| 1.23 | 1.2 |
|
||||
| 7.89 | 7.9 |
|
||||
| 12.79 | 13 |
|
||||
| 123.45 | 120 |
|
||||
+--------+------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
当转换 `ANSI FLOAT` 数据时,您可以使用 OceanBase 数据库内部使用的 `FLOAT` 数据类型。但是建议您改用 `BINARY_FLOAT` 和 `BINARY_DOUBLE` 浮点数字。
|
||||
|
@ -1,28 +0,0 @@
|
||||
浮点数字
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
浮点数字(FLOAT-Point Numbers)可以有小数点,从第一位到最后一位,或者根本没有小数点。您可以选择在数字后使用指数来增加范围,例如 1.666 e^-20^。小数位数不适用于浮点数,因为小数点后可以出现的位数不受限制。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
二进制浮点数与 `NUMBER` 的区别,在于值是由 OceanBase 数据库内部存储的。`NUMBER` 数据类型使用十进制精度存储,所存储的数据都会精确存储。二进制浮点数(FLOAT-Point Numbers)是使用二进制精度(数字 0 和 1)存储的,这种存储值的方式不能精确地表达使用十进制精度的所有值。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
OceanBase 数据库为浮点数提供了两种数字数据类型:
|
||||
|
||||
* `BINARY_FLOAT`,是一种 32 位单精度浮点数数据类型。每个 `BINARY_FLOAT` 值需要 4 个字节。
|
||||
|
||||
|
||||
|
||||
* `BINARY_DOUBLE`,是一种 64 位双精度浮点数数据类型。每个 `BINARY_DOUBLE` 值需要 8 个字节。
|
||||
|
||||
* 您可以根据值域范围指定浮点数。
|
||||
|
||||
* OceanBase 浮点数据类型的实现基本上符合电气和电子工程师协会(IEEE)的二进制浮点算法标准。
|
||||
|
||||
|
@ -1,31 +0,0 @@
|
||||
数值类型的优先级
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
不同的数值数据类型在操作时有不同的优先级。在 OceanBase 中,`BINARY_DOUBLE` 的优先级最高,其次是 `BINARY_FLOAT`,最后是 `NUMBER` 。
|
||||
|
||||
在对多个数值进行操作时:
|
||||
|
||||
* 若有一个操作数为 `BINARY_DOUBLE`,OceanBase 会在执行该操作之前将所有操作数转换为
|
||||
|
||||
`BINARY_DOUBLE`。
|
||||
|
||||
* 若有一个操作数为 `BINARY_FLOAT`,OceanBase 会在执行该操作之前将所有操作数转换为 `BINARY_FLOAT`。
|
||||
|
||||
|
||||
|
||||
* 若有一个操作数都不是 `BINARY_DOUBLE` 和 `BINARY_FLOAT`,OceanBase 会在执行该操作之前将所有操作数转换为 `NUMBER`。
|
||||
|
||||
|
||||
|
||||
* 若所需要的转换失败,则该操作将失败。
|
||||
|
||||
|
||||
|
||||
* 与其他数据类型相比,数值数据类型的优先级低于日期时间与间隔数据类型,高于字符和所有其他数据类型。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,48 +0,0 @@
|
||||
日期时间和间隔数据类型概述
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
与 Oracle 中的数据类型一致,OceanBase 也支持日期时间和间隔数据类型。
|
||||
|
||||
日期时间数据类型
|
||||
--------------------
|
||||
|
||||
日期时间数据类型被用来在数据库中保存日期和时间,此类别中有以下数据类型:
|
||||
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
|--------------------------------|------------------------------|
|
||||
| DATE | 存储日期和时间信息,精确到秒,不带时区。 |
|
||||
| TIMESTAMP | `DATE` 数据类型的扩展,精确到纳秒,不带时区。 |
|
||||
| TIMESTAMP WITH TIME ZONE | `DATE` 数据类型的扩展,精确到纳秒,带时区信息。 |
|
||||
| TIMESTAMP WITH LOCAL TIME ZONE | 带有本地时区的 `TIMESTAMP`,存储数据库时区。 |
|
||||
|
||||
|
||||
|
||||
间隔数据类型
|
||||
------------------
|
||||
|
||||
与日期时间数据类型存储特定的一个时间点不同,间隔数据类型用来存储一段时间。间隔数据类型有效的存储了两个日期时间值之间的差异,此类别中有以下数据类型:
|
||||
|
||||
|
||||
| **数据类型** | **说明** |
|
||||
|------------------------|----------------------|
|
||||
| INTERVAL YEAR TO MONTH | 存储以年和月为单位的时间段。 |
|
||||
| INTERVAL DAY TO SECOND | 存储以天、小时、分钟和秒为单位的时间段。 |
|
||||
|
||||
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
* [夏令时](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/4.date-time-and-interval-data-types/4.timestamp-with-time-zone-data-type.md)
|
||||
|
||||
|
||||
|
||||
* [日期时间 DATE 和间隔 INTERVAL 的计算](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/4.date-time-and-interval-data-types/8.calculation-of-date-time-and-interval.md)
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,96 +0,0 @@
|
||||
DATE 数据类型
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`DATE` 数据类型存储日期和时间信息。尽管日期和时间信息可以用字符和数字数据类型表示,但 `DATE` 数据类型具有特殊的关联属性。对于每个 `DATE` 值,OceaBase 存储以下信息:年、月、日、小时、分钟和秒,但是并不包含时区信息。
|
||||
|
||||
格式
|
||||
--------------
|
||||
|
||||
`DATE` 数据类型的默认输入输出格式由 `NLS_DATE_FORMAT` 决定,运行以下 SQL 语句查看默认格式:
|
||||
|
||||
```javascript
|
||||
SELECT @@NLS_DATE_FORMAT FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
DD-MON-RR
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果您需要自定义数据的格式,可以使用转换函数。在插入数据时,您可以通过函数 TO_DATE (char,fmt) 指定数据的输入格式。查询数据时,您可以通过函数 TO_CHAR (datetime,fmt) 指定数据的输出格式。这两个转换函数会将字符串转化为参数 `fmt` 中定义的格式。在 `fmt` 未指明的情况下,使用默认格式。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
`DATE` 数据类型储存小时、分钟和秒等时间信息,但是默认格式中并不包含时间信息。
|
||||
|
||||
取值范围
|
||||
----------------
|
||||
|
||||
`0001-01-01 00:00:00`\~`9999-12-31 23:59:59`
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
* **示例1:** 返回当前的系统日期,由于未指定参数 `fmt`,所以 `TO_CHAR` 按数据类型的默认格式返回数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(sysdate) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+------------------+
|
||||
| TO_CHAR(SYSDATE) |
|
||||
+------------------+
|
||||
| 24-FEB-20 |
|
||||
+------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* **示例2:** 在未指定 `DATE` 字面量的情况下,数据库将返回系统默认值:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
本示例将使用 `TO_DATE(string, format)` 插入日期数据。`TO_DATE` 会将 `string` 中的字符串转化为`format` 中定义的格式。
|
||||
|
||||
例如当前查询是 2020 年 2 月发出的:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(TO_DATE('2020', 'YYYY'),'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+----------------------------------------------------------+
|
||||
| TO_CHAR(TO_DATE('2020', 'YYYY'),'YYYY-MM-DD HH24:MI:SS') |
|
||||
+----------------------------------------------------------+
|
||||
| 2020-02-01 00:00:00|
|
||||
+----------------------------------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,110 +0,0 @@
|
||||
TIMESTAMP 数据类型
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
日期时间数据类型中除了 `DATE` 数据类型以外还有 `TIMESTAMP[(scale)]` 时间戳数据类型。它是 `DATE` 数据类型的扩展,跟 `DATE` 数据类型一样,它存储了年、月、日、时、分和秒等信息,但是不存储时区信息,它的时间最大可以精确到纳秒。所以它常用于存储时间精确度高和不需要考虑时区变换的数据。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
TIMESTAMP [(scale)]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 取值范围 | 说明 |
|
||||
|-------|------|-----------------------------------------------------------------------------------------------------|
|
||||
| scale | 0\~9 | `TIMESTAMP[(scale)]` 的范围和精确度取决于 `scale` 的值,最大值为 9(纳秒,即秒数精确至小数点 9 位),最小值为 0(秒,即秒数精确至小数点 0 位),默认值为 6。 |
|
||||
|
||||
|
||||
|
||||
格式
|
||||
--------------
|
||||
|
||||
`TIMESTAMP` 数据类型的默认输入输出格式由 `NLS_TIMESTAMP_FORMAT` 决定,运行以下 SQL 语句查看默认格式:
|
||||
|
||||
```javascript
|
||||
SELECT @@NLS_TIMESTAMP_FORMAT FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
DD-MON-RR HH.MI.SSXFF AM
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果您需要自定义数据的格式,可以使用转换函数。在插入数据时,您可以通过函数 TO_TIMESTAMP (char,fmt) 指定数据的输入格式。查询数据时,您可以通过函数 TO_CHAR (datetime,fmt) 指定数据的输出格式。这两个转换函数会将字符串转化为参数 `fmt` 中定义的格式。在 `fmt` 未指明的情况下,使用默认格式。
|
||||
|
||||
取值范围
|
||||
----------------
|
||||
|
||||
`0001-01-01 00:00:00.000000000` \~ `9999-12-31 23:59:59.999999999`
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
* **示例1** :如下代码所示,在表 **Timestamp_Sample** 中创建了数据类型为 `TIMESTAMP` 的两列 **timestp1** 和 **timestp2** , 并且为 **timestp2** 指定了时间的精度为 3。向两列同时使用 `TO_TIMESTAMP(string, format)` 插入日期值 **2020-01-01 11:00:00** 。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE Timestamp_Sample(timestp1 TIMESTAMP, timestp2 TIMESTAMP(3));
|
||||
INSERT INTO Timestamp_Sample(timestp1,timestp2) VALUES(TO_TIMESTAMP('2020-01-01 11:00:00','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2020-01-01 11:00:00','YYYY-MM-DD HH24:MI:SS'));
|
||||
SELECT * FROM Timestamp_Sample;
|
||||
```
|
||||
|
||||
|
||||
|
||||
结果如下,可以看到 **timestp1** 由于没有指定 `scale` 的值,所以结果时间精度默认为 6 位, **timestp2** 在指定后精度为 3 位:
|
||||
|
||||
```javascript
|
||||
+------------------------------+---------------------------+
|
||||
| timestamp1 | timestamp2 |
|
||||
+------------------------------+---------------------------+
|
||||
| 01-JAN-20 11.00.00.000000 AM | 01-JAN-20 11.00.00.000 AM |
|
||||
+------------------------------+---------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* **示例2** :以下语句使用函数 `TO_CHAR (datetime,fmt)` 指定输出格式。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(TO_TIMESTAMP_TZ('25-FEB-20 11:00:00 AM America/Los_Angeles','DD-MON-RR HH:MI:SSXFF PM TZR'),'YYYY-MM-DD HH:MI:SSXFF PM TZR') Timestamp
|
||||
FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+------------------------------------------------------+
|
||||
| Timestamp |
|
||||
+------------------------------------------------------+
|
||||
| 2020-02-25 11:00:00.000000000 AM America/Los_Angeles |
|
||||
+------------------------------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,129 +0,0 @@
|
||||
TIMESTAMP WITH TIME ZONE 数据类型
|
||||
==================================================
|
||||
|
||||
|
||||
|
||||
`TIMESTAMP [(scale)] WITH TIME ZONE` 是 `TIMASTAMP [(scale)]` 的变体,与 `TIMASTAMP [(scale)]` 一样,它存储了年、月、日、时、分和秒等信息,阈值和精确度取决于 `scale` 的值。但是与 `TIMASTAMP [(scale)]` 不同的是它还可以存储时区信息,所以常用于存储跨地理区域的日期时间信息。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
TIMESTAMP [(scale)] WITH TIME ZONE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 取值范围 | 说明 |
|
||||
|-------|------|----------------------------------------------------------------------------------------------------------------------|
|
||||
| scale | 0\~9 | `TIMESTAMP [(scale)] WITH TIME ZONE` 的阈值和精确度取决于 `scale` 的值,最大值为 9 (纳秒,即秒数精确至小数点 9 位),最小值为 0(秒,即秒数精确至小数点 0 位),默认值为 6。 |
|
||||
|
||||
|
||||
|
||||
格式
|
||||
--------------
|
||||
|
||||
`TIMESTAMP WITH TIME ZONE` 数据类型的默认输入输出格式由 `NLS_TIMESTAMP_TZ_FORMAT` 决定,运行以下 SQL 语句查看默认格式:
|
||||
|
||||
```javascript
|
||||
SELECT @@NLS_TIMESTAMP_TZ_FORMAT FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
DD-MON-RR HH.MI.SSXFF AM TZR
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果您需要自定义数据的格式,可以使用转换函数。在插入数据时,您可以通过函数 TO_TIMESTAMP_TZ (char,fmt) 指定数据的输入格式。查询数据时,您可以通过函数 TO_CHAR (datetime,fmt) 指定数据的输出格式。这两个转换函数会将字符串转化为参数 `fmt` 中定义的格式。在 `fmt` 未指明的情况下,使用默认格式。
|
||||
|
||||
取值范围
|
||||
----------------
|
||||
|
||||
`0001-01-01 00:00:00.000000000` \~ `9999-12-31 23:59:59.999999999`
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
以下示例都使用 `TO_TIMESTAMP_TZ (char,fmt)` 输入时间戳值。
|
||||
|
||||
在插入时区时, OceanBase 支持使用时区偏移量和时区区域名称:
|
||||
|
||||
* 时区偏移量:与格林尼治标准时间 GMT 的差(小时和分钟)
|
||||
|
||||
|
||||
|
||||
* 时区区域名称(TZR)及时区缩写(TZD):国家/城市 时区缩写
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 使用时区偏移量
|
||||
|
||||
执行以下语句,使用时区偏移量插入数值:
|
||||
|
||||
```javascript
|
||||
SELECT TO_TIMESTAMP_TZ('2020-01-01 11:00:00 -05:00','YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
01-JUN-20 11.00.00.000000000 AM AMERICA/LOS_ANGELES
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 使用时区区域名称及时区缩写
|
||||
|
||||
执行以下语句,使用时区区域名称及缩写插入数值:
|
||||
|
||||
```javascript
|
||||
SELECT TO_TIMESTAMP_TZ('2020-01-01 11:00:00 America/Los_Angeles PST','YYYY-MM-DD HH:MI:SS TZR TZD') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PST
|
||||
```
|
||||
|
||||
|
||||
|
||||
夏令时
|
||||
---------------
|
||||
|
||||
OceanBase 支持夏令时且用时区缩写表示夏令时信息,以 America/Los_Angeles 为例,夏令时 PDT 从每年的 3 月的第二个星期日到 11 月的第一个星期日执行,其余时间为 PST。当插入的值中只包含时区区域名称时,OceanBase 会根据插入的时间信息判断当前插入的时区区域是否在夏令时时段,并在返回的结果中会包含时区缩写,以此指明当前时间是夏令时。
|
||||
|
||||
您可以执行以下示例代码:
|
||||
|
||||
```javascript
|
||||
SELECT TO_TIMESTAMP_TZ('2020-02-01 11:00:00 America/Los_Angeles','YYYY-MM-DD HH:MI:SS TZR') FROM DUAL;
|
||||
SELECT TO_TIMESTAMP_TZ('2020-06-01 11:00:00 America/Los_Angeles','YYYY-MM-DD HH:MI:SS TZR') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PST
|
||||
01-JUN-20 11.00.00.000000000 AM America/Los_Angeles PDT
|
||||
```
|
||||
|
||||
|
@ -1,99 +0,0 @@
|
||||
TIMESTAMP WITH LOCAL TIME ZONE 数据类型
|
||||
========================================================
|
||||
|
||||
|
||||
|
||||
`TIMESTAMP [(scale)] WITH LOCAL TIME ZONE` 数据类型的时区信息是当前会话发生的时区。与 `TIMASTAMP [(scale)] WITH TIME ZONE` 的区别在于用户不需要自己输入时区信息,OceanBase 直接存储默认的数据库时区 +00:00 (不可更改)。当用户检索数据时,OceanBase 会返回本地会话时区(可更改)。此数据类型常用于始终在两层应用程序中的客户端系统的时区中显示的日期信息。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
TIMASTAMP [(scale)] WITH TIME ZONE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 取值范围 | 说明 |
|
||||
|-------|------|--------------------------------------------------------------------------|
|
||||
| scale | 0\~9 | `TIMESTAMP [(scale)]` 的阈值和精确度取决于 `scale` 的值,最大值为 9(纳秒),最小值为 0(秒),默认值为 6。 |
|
||||
|
||||
|
||||
|
||||
格式
|
||||
--------------
|
||||
|
||||
`TIMESTAMP WITH LOCAL TIME ZONE` 数据类型的默认输入输出格式由 `NLS_TIMESTAMP_FORMAT` 决定,运行以下 SQL 语句查看日期时间格式:
|
||||
|
||||
```javascript
|
||||
SELECT @@NLS_TIMESTAMP_FORMAT FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
DD-MON-RR HH.MI.SSXFF AM
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果您需要自定义数据的格式,可以使用转换函数。您可以通过函数 TO_CHAR (datetime,fmt) 指定数据的输出格式。这个转换函数会将字符串转化为参数 fmt 中定义的格式。在 `fmt` 未指明的情况下 `TO_CHAR` 按数据类型的默认格式返回数据。关于 `TIMESTAMP WITH TIME ZONE` 数据类型值的输入格式,您可以参阅文档 [时间戳字面量](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/3.literal-1/4.date-and-time-literal/2.timestamp-literal.md)。
|
||||
|
||||
取值范围
|
||||
----------------
|
||||
|
||||
`0001-01-01 00:00:00.000000000` \~ `9999-12-31 23:59:59.999999999`
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
`TIMESTAMP WITH TIME ZONE` 数据类型没有专门的字面量为其赋值,时区信息由 **SESSIONTIMEZONE** 返回本地对话时区。 **SESSIONTIMEZONE** 的值取自自定义参数 **TIME_ZONE** 。
|
||||
|
||||
```javascript
|
||||
CREATE TABLE LocalTZ ( ltzcol TIMESTAMP WITH LOCAL TIME ZONE);
|
||||
INSERT INTO LocalTZ VALUES (TIMESTAMP '2020-02-25 11:10:08.123');
|
||||
ALTER SESSION SET TIME_ZONE='+08:00';
|
||||
SELECT SESSIONTIMEZONE, ltzcol FROM LocalTZ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+-----------------+------------------------------+
|
||||
| SESSIONTIMEZONE | ltzcol |
|
||||
+-----------------+------------------------------+
|
||||
| +08:00 | 25-FEB-20 11:10:08.123000 AM |
|
||||
+-----------------+------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
可通过更改自定义参数 **TIME_ZONE** 的值而改变 **SESSIONTIMEZONE** :
|
||||
|
||||
```javascript
|
||||
ALTER SESSION SET TIME_ZONE='+00:00';
|
||||
SELECT SESSIONTIMEZONE, ltzcol FROM LocalTZ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+-----------------+------------------------------+
|
||||
| SESSIONTIMEZONE | ltzcol |
|
||||
+-----------------+------------------------------+
|
||||
| +00:00 | 25-FEB-20 03:10:08.123000 AM |
|
||||
+-----------------+------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,152 +0,0 @@
|
||||
INTERVAL YEAR TO MONTH 数据类型
|
||||
================================================
|
||||
|
||||
|
||||
|
||||
与 `DATE` 和 `TIMESTAMP` 数据类型储存特定的时间点日期不同,`INTERVAL YEAR TO MONTH` 使用日期元素 `YEAR` 和 `MONTH` 来储存一段时间,此数据类型对于表示两个日期时间值之间的差异很有用。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
INTERVAL YEAR [(percision)] TO MONTH
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 值 | 说明 |
|
||||
|-----------|------|------------------------------------------------------------------------------------------------------------------------|
|
||||
| percision | 0\~9 | 代表了 `YEAR` 元素的精度,默认值为 2。也就是说在不指定该参数的情况下,最大可以存储 99 年 11 个月的间隔日期 (最大不能超过 100 年)。如果存储的参数超过了默认精度 2 位,那么这个参数的值不能为空,必须被明确指定。 |
|
||||
|
||||
|
||||
|
||||
日期格式
|
||||
----------------
|
||||
|
||||
在插入 `INTERVAL YEAR TO MONTH` 数据类型的值时,有以下几种格式,更多关于间隔数据类型值的指定请参阅 [间隔字面量](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/3.literal-1/5.interval-literal.md):
|
||||
|
||||
|
||||
| **语法** | **示例** | **说明** |
|
||||
|-------------------------------------------------|------------------------------------|--------------------------------------------------------------|
|
||||
| INTERVAL 'year-month' YEAR(percision) TO MONTH | INTERVAL '120-3' YEAR(3) TO MONTH | 间隔 120 年 3 个月。由于 `YEAR` 元素的值大于默认精度 2,所以必须指定 `YEAR` 元素的精度为 3. |
|
||||
| INTERVAL 'year' YEAR(percision) | INTERVAL '50' YEAR | 间隔 50 年。 |
|
||||
| INTERVAL 'month' MONTH | INTERVAL '500' MONTH | 间隔 500 个月或者间隔 41 年 8 个月。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
如下代码所示,在表 **Interval_Sample** 中创建了数据类型为 `INTERVAL YEAR TO MONTH` 的三列 **interval1** 、 **interval2** 和 **interval3** ,并向其中插入数值:
|
||||
|
||||
```javascript
|
||||
CREATE TABLE Interval_Sample (
|
||||
interval1 INTERVAL YEAR TO MONTH,
|
||||
interval2 INTERVAL YEAR(3) TO MONTH,
|
||||
interval3 INTERVAL YEAR TO MONTH
|
||||
);
|
||||
INSERT INTO Interval_Sample (interval1, interval2, interval3)
|
||||
VALUES (INTERVAL '12-3' YEAR TO MONTH, INTERVAL '120-3' YEAR(3) TO MONTH, INTERVAL '40' MONTH);
|
||||
SELECT * FROM Interval_Sample;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+-----------+-----------+-----------+
|
||||
| interval1 | interval2 | interval3 |
|
||||
+-----------+-----------+-----------+
|
||||
| +12-03 | +120-03 | +03-04 |
|
||||
+-----------+-----------+-----------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
间隔与其他日期类型的计算
|
||||
------------------------
|
||||
|
||||
OceanBase 支持数据类型间的转换,所以间隔数据类型的值可以与其他日期值进行数学运算,但是数据库并不支持数据类型间任意的进行加、减、乘、除运算。请参阅文档 [日期时间 DATE 和间隔 INTERVAL 的计算](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/4.date-time-and-interval-data-types/8.calculation-of-date-time-and-interval.md) 中查看目前支持的日期类型计算矩阵图和 [数据类型转换](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/2.data-type-comparison-rules/6.data-type-conversion.md) 了解数更多数据类型转换的信息。
|
||||
|
||||
* **示例 1** :间隔与间隔的计算,返回的值仍为间隔数据类型。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT INTERVAL '2-2' YEAR TO MONTH -INTERVAL '1-1' YEAR TO MONTH calculate1, INTERVAL '2-2' YEAR TO MONTH + INTERVAL '1-1' YEAR TO MONTH calculate2 FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+---------------+----------------+
|
||||
| calculate1 | calculate2 |
|
||||
+--------------------------------+
|
||||
| +000000001-01 | +000000003-03 |
|
||||
+---------------+----------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* **示例 2** :间隔与日期时间的计算,返回的值为日期数据类型。`SYSDATE` 返回当前的时间 **2020-02-27 16:13:50** ,以下示例会返回从现在起两个月后的日期值。数据库只支持间隔+日期时间,而间隔-日期时间是无效运算。但是日期时间+间隔和日期时间-间隔都是有效运算。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(INTERVAL '2' MONTH +SYSDATE,'YYYY-MM-DD HH24:MI:SS') calculate3 FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+---------------------+
|
||||
| calculate3 |
|
||||
+---------------------+
|
||||
| 2020-04-27 16:13:50 |
|
||||
+---------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **示例 3** :间隔和数字的运算,返回的值仍为间隔数据类型。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
间隔可以与数字进行乘除运算。以下示例展示了间隔 2 月乘以 2 的计算和间隔 2 天除以 3 的计算。
|
||||
|
||||
```javascript
|
||||
SELECT INTERVAL '2' MONTH*2 calculate4, INTERVAL '2' DAY/3 calculate5 FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果为间隔 4 月和间隔 16 小时:
|
||||
|
||||
```javascript
|
||||
+---------------+-------------------------------+
|
||||
| calculate4 | calculate5 |
|
||||
+---------------+-------------------------------+
|
||||
| +000000000-04 | +000000000 16:00:00.000000000 |
|
||||
+---------------+-------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
[](qqvecg)
|
@ -1,76 +0,0 @@
|
||||
INTERVAL DAY TO SECOND 数据类型
|
||||
================================================
|
||||
|
||||
|
||||
|
||||
`INTERVAL DAY TO SECOND` 可存储以天、小时、分钟和秒为单位的时间段。此数据类型对于表示两个日期时间值之间的精确差异很有用。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
INTERVAL DAY [(precision)] TO SECOND [(fractional_seconds_precision)]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 值 | 说明 |
|
||||
|------------------------------|------|--------------------------------|
|
||||
| precision | 0\~9 | 代表了 `DAY` 元素的精度,默认值为 2。 |
|
||||
| fractional_seconds_precision | 0\~9 | 代表了 `SECOND` 元素小数部分的精度,默认值为 6。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
在插入 `INTERVAL DAY TO SECOND` 数据类型的值时,有以下几种格式,更多关于间隔数据类型值的指定请参阅 [间隔字面量](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/3.literal-1/5.interval-literal.md):
|
||||
|
||||
|
||||
| 语法 | 示例 | 说明 |
|
||||
|--------------------------------------------------------------------------------|----------------------------------------------------|-----------------------------------|
|
||||
| INTERVAL 'dd hh:mm:ss' DAY(precision) TO SECOND(fractional_seconds_precision) | INTERVAL '140 5:12:10.2222222' DAY(3) TO SECOND(7) | 间隔 140 天 5 小时 12 分钟 10.2222222 秒。 |
|
||||
| INTERVAL 'dd hh'DAY(precision) TO HOUR | INTERVAL '400 5' DAY(3) TO HOUR | 间隔 400 天 5 小时。 |
|
||||
| INTERVAL 'dd hh:mm'DAY(precision) TO MINUTE | INTERVAL '4 5:12' DAY TO MINUTE | 间隔 4 天 5 小时 12 分钟。 |
|
||||
| INTERVAL 'hh:mm' HOUR TO MINUTE | INTERVAL '11:20' HOUR TO MINUTE | 间隔 11 小时 20 分钟。 |
|
||||
| INTERVAL 'hh:mm:ss' HOUR TO SECOND(fractional_seconds_precision) | INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) | 间隔 11 小时 12 分钟 10.2222222 秒。 |
|
||||
| INTERVAL 'dd' DAY(precision) | INTERVAL '14' DAY | 间隔 14 天。 |
|
||||
| INTERVAL 'hh' HOUR | INTERVAL '160' HOUR | 间隔 160 小时。 |
|
||||
| INTERVAL 'mm' MINUTE | INTERVAL '14' MINUTE | 间隔 14 分钟。 |
|
||||
| INTERVAL 'ss' SECOND(fractional_seconds_precision) | INTERVAL '14.666' SECOND(2, 3) | 间隔 14.666 秒。 |
|
||||
|
||||
|
||||
|
||||
如下代码所示,在表 **Interval_Sample** 中创建了数据类型为 `INTERVAL DAY TO SECOND` 的两列 **interval1** 、 **interval2** 并向这两列中插入数值:
|
||||
|
||||
```javascript
|
||||
CREATE TABLE Interval_Sample (interval1 INTERVAL DAY TO SECOND, interval2 INTERVAL DAY(3) TO SECOND(3));
|
||||
INSERT INTO Interval_Sample (interval1, interval2) VALUES ( INTERVAL '15 06:10:08' DAY TO SECOND, INTERVAL '150 06:10:08' DAY(3) TO SECOND(3));
|
||||
SELECT * FROM Interval_Sample;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+---------------------+-------------------+
|
||||
| interval1 | interval2 |
|
||||
+---------------------+-------------------+
|
||||
| +15 06:10:08.000000 | +150 06:10:08.000 |
|
||||
+---------------------+-------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
间隔与其他日期类型的计算
|
||||
------------------------
|
||||
|
||||
OceanBase 支持数据类型间的转换,所以间隔数据类型的值可以与其他日期值进行数学运算。但是数据库并不支持数据类型间任意的进行加、减、乘、除运算。请参阅文档 [日期时间 DATE 和间隔 INTERVAL 的计算](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/4.date-time-and-interval-data-types/8.calculation-of-date-time-and-interval.md) 中查看目前支持的日期类型计算矩阵图和参阅文档 [数据类型转换](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/2.data-type-comparison-rules/6.data-type-conversion.md) 了解数更多数据类型转换的信息。
|
||||
|
||||
关于间隔与其他数据类型计算的示例,请参阅文档 [INTERVAL YEAR TO MONTH 数据类型](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/1.built-in-data-types/4.date-time-and-interval-data-types/6.interval-year-to-month-data-type.md) 。
|
@ -1,73 +0,0 @@
|
||||
日期时间 DATE 和间隔 INTERVAL 的计算
|
||||
===============================================
|
||||
|
||||
|
||||
|
||||
您可以在日期(`DATE`)、时间戳(`TIMESTAMP`、`TIMESTAMP WITH TIME ZONE` 和 `TIMESTAMP WITH LOCAL TIME ZONE`)和间隔(`INTERVAL YEAR TO MONTH` 和 `INTERVAL DAY TO SECOND`)上执行许多算术运算。
|
||||
|
||||
OceanBase 根据以下规则计算结果:
|
||||
|
||||
* 您可以在日期和时间戳值(而非间隔值)的算术运算中使用 `NUMBER` 常数。OceanBase 在内部将时间戳值转换为日期值,并将算术日期时间和间隔表达式中的 `NUMBER` 常量解释为天数。例如,`SYSDATE` +1 是明天。`SYSDATE`-7 是一周前。`SYSDATE` +(10/1440)是十分钟之后。
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
您不能乘以或除以日期或时间戳值。
|
||||
|
||||
|
||||
* OceanBase 将 `BINARY_FLOAT` 和 `BINARY_DOUBLE` 操作数转换为 `NUMBER`。
|
||||
|
||||
|
||||
|
||||
* 每个 `DATE` 值都包含一个时间成分,许多日期运算的结果都包含一个分数。此分数表示一天的一部分。例如,1.5 天是 36 个小时。OceanBase 内置函数还返回这些分数,以对 `DATE` 数据执行常见操作。例如,`MONTHS_BETWEEN` 函数返回两个日期之间的月数。结果的小数部分代表一个 31 天月份的那部分。
|
||||
|
||||
|
||||
|
||||
* 如果一个操作数是 `DATE` 值或数字值,但都不包含时区或小数秒部分,则:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 当您将时间戳,时间间隔或数字值传递给仅限于 `DATE` 数据类型使用的内置函数时,OceanBase 将把非 `DATE` 值转换为 `DATE` 值。
|
||||
|
||||
|
||||
|
||||
* 当间隔计算返回日期时间值时,结果必须是实际的日期时间值,否则数据库将返回错误。例如,以下两个语句返回错误:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT TO_DATE("31-AUG-2004','DD-MON-YYYY") + TO_YMINTERVAL("0-1") FROM DUAL;
|
||||
SELECT TO_DATE("29-FEB-2004','DD-MON-YYYY") + TO_YMINTERVAL("1-0") FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
第一条语句失败,因为在一个有31天的月份上增加一个月,导致计算结果为 9 月 31 日,这不是有效的日期。第二条语句失败,因为在仅每四年存在的日期上增加一年是无效的。但是,在 2 月 29 日之前加上四年是有效的,计算结果为2008年2月29日:
|
||||
|
||||
```javascript
|
||||
SELECT TO_DATE("29-FEB-2004", "DD-MON-YYYY") + TO_YMINTERVAL("4-0") FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 下表是日期时间算术运算的矩阵。"---"表示不支持的操作。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.png")
|
@ -1,139 +0,0 @@
|
||||
RAW 数据类型
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
`RAW` 是一种可变长度的数据类型,在不同平台上传输时,传送的都是二进制信息,即使字符集不同也不需要转换。OceanBase 数据库中用于保存二进制数据或字节字符串。
|
||||
|
||||
`RAW` 类似于 `VARCHAR2`,声明方式是 `RAW(length)`,`length` 为长度,以字节为单位,作为数据库列最大存储 2000 个字节,作为变量最大存储 2000 字节。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
RAW(length)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------|--------------------------------------------------------|
|
||||
| length | 表示长度,以字节为单位,作为数据库列最大存储 2000 字节的数据,作为变量最大存储 2000 字节的数据。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
* **示例 1:** 在 **test_raw** 表中声明 `RAW` 型数据,并向表中插入一条数据。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE test_raw (c1 RAW(10));
|
||||
INSERT INTO test_raw VALUES (utl_raw.cast_to_raw('1234567890'));
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT utl_raw.cast_to_varchar2(c1) FROM test_raw;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------------------+
|
||||
| UTL_RAW.CAST_TO_RAW(C1) |
|
||||
+-------------------------------+
|
||||
| 1234567890 |
|
||||
+-------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **示例 2:** 向 **raw_test** 表中插入 2 条数据。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE raw_test (id number, raw_date raw(10));
|
||||
INSERT INTO raw_test VALUES (1, hextoraw('ff'));
|
||||
INSERT INTO raw_test VALUES (2, utl_raw.cast_to_raw('051'));
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM raw_test;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------+----------+
|
||||
| ID | RAW_DATE |
|
||||
+------+----------+
|
||||
| 1 | FF |
|
||||
| 2 | 303531 |
|
||||
+------+----------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
SQL 函数 `HEXTORAW()` 会把字符串中数据转换为 16 进制数。SQL 函数 `UTL_RAW.CAST_TO_RAW([VARCHAR2])` 会把字符串中每个字符的 ASCII 码存放到 `RAW` 类型的字段中。例如, **051** 转换为 **303531** 。
|
||||
|
||||
* **示例 3:** OceanBase 数据库将 `RAW` 数据转换为字符数据,每个字符代表 `RAW` 数据的四个连续位的十六进制数(0\~9 和 A\~F 或 a\~f)。
|
||||
|
||||
|
||||
|
||||
|
||||
如:二进制位数 11001011,其 `RAW` 数据转换后为字符 **CB** 。
|
||||
|
||||
OceanBase 数据库将字符数据转换为 `RAW`,它是把每个连续的输入字符解释为二进制数据的四个连续位,通过把这些位进行级联,来构建结果 `RAW` 值。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
如果任一输入字符不是十六进制数(0\~9 和 A\~F 或 a\~f),则将报告错误。如果字符数为奇数,则结果不确定。
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
### 字符转换
|
||||
|
||||
在数据库之间传输数据,或者在数据之间传输数据库字符集和客户端字符集时,OceanBase 数据库会自动在不同数据库字符集之间转换 `CHAR` 和 `VARCHAR2` 数据。而传输 `RAW` 数据时 OceanBase 数据库不执行字符转换。
|
||||
|
||||
### RAW 的函数
|
||||
|
||||
|
||||
|
||||
| 函数 | 说明 |
|
||||
|------------------------------------------------------|----------------------------------------------------------------------------------------------|
|
||||
| HEXTORAW() | 当使用 `hextoraw` 时,会把字符串中数据转换成 16 进制串,字符串中的每两个字符表示了结果 `RAW` 中的一个字节。 |
|
||||
| RAWTOHEX(rawvalue) | 将 `RAW` 类数值 `rawvalue` 转换为一个相应的十六进制表示的字符串。 `rawvalue` 中的每个字节都被转换为一个双字节的字符串。 |
|
||||
| UTL_RAW_CAST_TO_RAW(\[VARCHAR2\]) | 保持数据的存储内容不变,仅改变数据类型,将 `VARCHAR2` 转换为 `RAW` 类型。 |
|
||||
| UTL_RAW_CAST_TO_VARCHAR2(\[RAW\]) | 保持数据的存储内容不变,仅改变数据类型,将 `RAW` 类型转换为 `VARCHAR2` 类型。 |
|
||||
| UTL_RAW.BIT_OR()、UTL_RAW.BIT_AND()、UTL_RAW.BIT_XOR() | 位操作。 |
|
||||
|
||||
|
||||
|
@ -1,19 +0,0 @@
|
||||
大对象数据类型概述
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
大对象数据类型(Large Object),简称 LOB,用来存储大型和非结构化数据,例如文本、图像、视频和空间数据等。包括 `BLOB` 和 `CLOB` 。
|
||||
|
||||
您在创建表时,可以选择为 LOB 列或 LOB 对象属性指定与表中指定的不同的表空间和存储特征。
|
||||
|
||||
OceanBase 支持以下大对象数据类型:
|
||||
|
||||
|
||||
| 类型 | 长度 | **定义长度上限(字符)** | 字符集 |
|
||||
|------|----|----------------|---------|
|
||||
| BLOB | 变长 | 48M | BINARY |
|
||||
| CLOB | 变长 | 48M | UTF8MB4 |
|
||||
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
BLOB 数据类型
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`BLOB` 全称为二进制大型对象(Binary Large Object)。它用于存储数据库中的大型二进制对象,可以将 `BLOB` 对象视为没有字符集语义的位流。`BLOB` 存储的二进制数据,其字节的长度上限为 48M,字符集是 `BINARY`。
|
||||
|
||||
`BLOB` 对象具有完整的事务支持。通过 `SQL`、`DBMS_ LOB` 软件包进行的更改将完全参与事务。可以提交和回滚 `BLOB` 值操作。但是,您不能在一个事务中将 `BLOB` 定位器保存在 PL 中,然后在另一事务或会话中使用它。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
存储的二进制文件过大,会使数据库的性能下降。
|
||||
|
||||
在数据库中,通常像图片、文件、音乐等大文件信息就用 `BLOB` 字段来存储,它先将大文件转为二进制再存储进去。
|
||||
|
||||
如下,创建表 **blob_table** ,并设置 **blob_cl** 列为 `BLOB` 数据类型。
|
||||
|
||||
```javascript
|
||||
CREATE TABLE blob_table (blob_cl BLOB);
|
||||
```
|
||||
|
||||
|
@ -1,19 +0,0 @@
|
||||
CLOB 数据类型
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`CLOB` 全称为字符大型对象(Character Large Object)。它用于存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集,且都使用数据库字符集。`CLOB` 不支持宽度不等的字符集。可存储字节的长度上限(字符)是 48 M,字符集是 `UTF8MB4`。
|
||||
|
||||
`CLOB` 对象具有完整的事务支持。通过 `SQL`、`DBMS_ LOB` 软件包进行的更改将完全参与事务。可以提交和回滚 `CLOB` 值操作。但是,您不能在一个事务中将 `CLOB` 定位器保存在 PL 中,然后在另一事务或会话中使用它。
|
||||
|
||||
由于 `VARCHAR2` 类型字段长度最大 32767,若需要保存的字段长度大于 32767,可以使用 `CLOB` 类型。另外,可以使用 `CLOB` 来保存 `CHAR` 数据,如 XML 文档就是用 `CLOB` 数据保存内容。
|
||||
|
||||
例如,创建表 **temp** ,设置 **temp_clob** 列为 `CLOB` 数据类型。
|
||||
|
||||
```javascript
|
||||
CREATE TABLE temp (temp_clob CLOB);
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,41 +0,0 @@
|
||||
数据类型比较规则概述
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
数据类型比较规则规定了 OceanBase 数据库如何比较每种数据类型的值。
|
||||
|
||||
OceanBase 数据类型比较规则支持以下数据值:
|
||||
|
||||
* 数值
|
||||
|
||||
|
||||
|
||||
* 日期值
|
||||
|
||||
|
||||
|
||||
* 字符值
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
* [数据类型优先级](../../../11.sql-reference-oracle-mode/3.basic-elements-1/2.data-type-comparison-rules/5.data-type-priority.md)
|
||||
|
||||
|
||||
|
||||
* [数据类型转换](../../../11.sql-reference-oracle-mode/3.basic-elements-1/2.data-type-comparison-rules/6.data-type-conversion.md)
|
||||
|
||||
|
||||
|
||||
* [数据转换的安全注意事项](../../../11.sql-reference-oracle-mode/3.basic-elements-1/2.data-type-comparison-rules/7.security-considerations-for-data-conversion.md)
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
数值
|
||||
===
|
||||
|
||||
数值数据有定点数、浮点数和零。
|
||||
|
||||
数值数据比较规则如下:
|
||||
|
||||
* 较大的值大于较小的值,如:5.5 \> 2.1。
|
||||
* 负数均小于零,如 -3 \< 0, -200 \< -1。
|
||||
* 正数均大于零,如 20 \> 0, 100 \> 1。
|
||||
|
@ -1,23 +0,0 @@
|
||||
日期值
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`DATE` 数据类型存储日期和时间信息。每个 `DATE` 值,OceanBase 存储以下信息:年、月、日、小时、分钟和秒,但是并不包含时区信息。
|
||||
|
||||
日期数据比较规则如下:
|
||||
|
||||
* 现在的时间大于过去的时间,如 2018 年 5 月 1 日的日期值大于 2012 年 5 月 1 日的日期值。
|
||||
|
||||
|
||||
|
||||
* 下午的时间大于早上的时间,如 2019 年 2 月 2 日下午 3:30 的日期时间值大于 2019 年 2 月 2 日 上午 10:30 的日期时间值。
|
||||
|
||||
|
||||
|
||||
* 早上的时间大于昨天的时间,如 2019 年 3 月 5 日上午 2:30 的日期时间值大于 2019 年 3 月 4 日下午 23:30 的日期时间值。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,67 +0,0 @@
|
||||
字符值
|
||||
========================
|
||||
|
||||
|
||||
|
||||
字符数据是根据字符值大小比较的,而字符值则根据以下两种度量进行比较:
|
||||
|
||||
* 二进制和语言比较
|
||||
|
||||
|
||||
|
||||
* 空白填充或非填充比较语义
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
二进制和语言比较
|
||||
--------------------
|
||||
|
||||
### 二进制比较
|
||||
|
||||
在默认的二进制比较中,OceanBase 根据数据库字符集中字符的数字代码的级联值比较字符串。如果一个字符在字符集中的数值大于另一个,则该字符更大。OceanBase 不支持 ASCII 字符集和 EBCDIC 字符集。
|
||||
|
||||
### 语言比较
|
||||
|
||||
在语言排序中,SQL 排序和比较都按照 `NLS_SORT` 指定的语言规则。若字符编码的二进制序列与字符集要求的语言序列不匹配,则使用语言比较。若 `NLS_SORT` 参数的设置不是 `BINARY`,且 `NLS_COMP` 参数设置为 `LINGUISTIC`,则使用语言比较。
|
||||
|
||||
空白填充和非填充比较语义
|
||||
------------------------
|
||||
|
||||
### 空白填充比较语义
|
||||
|
||||
使用空白填充语义,若两个值的长度不同,则 OceanBase 首先将空格添加到较短的空格的末尾,以便它们的长度相等。然后,OceanBase 逐个字符地比较值,直到第一个不同的字符为止。在第一个不同位置具有较大字符的值被认为较大。如果两个值没有不同的字符,则认为它们相等。此规则意味着两个值仅在尾随空白数上不同时相等。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
只有当比较中的两个值都是数据类型 `CHAR`、`NCHAR`、文本文字或 `USER` 函数返回的值时,OceanBase 就会使用空白填充的比较语义。
|
||||
|
||||
### 非填充比较语义
|
||||
|
||||
使用非填充语义,OceanBase 逐个字符地比较两个值,直到第一个不同的字符为止。该位置上具有较大字符的值被认为较大。如果两个不同长度的值在较短的值之前一直相同,则较长的值被认为较大。如果两个长度相等的值没有不同的字符,则认为这些值相等。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
只要比较中的一个或两个值的数据类型为 `VARCHAR2` 或 `NVARCHAR2`,OceanBase 就会使用非填充比较语义。
|
||||
|
||||
### 示例
|
||||
|
||||
使用不同的比较语义比较两个字符值的结果不同。本示例显示了使用空白填充语义和非填充语义比较。
|
||||
|
||||
|
||||
| 空白填充 | 非填充 |
|
||||
|-----------------|-----------------|
|
||||
| 'ac' \> 'ab' | 'ac' \> 'ab' |
|
||||
| 'ab' \> 'a ' | 'ab' \> 'a ' |
|
||||
| 'ab' \> 'a' | 'ab' \> 'a' |
|
||||
| 'ab' = 'ab' | 'ab' = 'ab' |
|
||||
| 'ac' \> 'ab' | 'ac' \> 'ab' |
|
||||
| 'a ' = 'a' | 'a ' \> 'a' |
|
||||
|
||||
|
||||
|
||||
通常,空白填充和非填充比较的结果是相同的。而最后一行的比较示例说明了空白填充和非填充比较语义之间的区别。
|
@ -1,29 +0,0 @@
|
||||
数据类型优先级
|
||||
============================
|
||||
|
||||
|
||||
|
||||
OceanBase 使用数据类型优先级来确定隐式数据类型转换顺序。
|
||||
|
||||
OceanBase 数据类型的转换优先级如下(由高到低):
|
||||
|
||||
1. 日期时间和间隔数据类型
|
||||
|
||||
|
||||
|
||||
2. `BINARY_DOUBLE` 数据类型
|
||||
|
||||
3. `BINARY_FLOAT` 数据类型
|
||||
|
||||
4. `NUMBER` 数据类型
|
||||
|
||||
5. 字符数据类型
|
||||
|
||||
|
||||
|
||||
6. 所有其他内置数据类型
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,181 +0,0 @@
|
||||
数据类型转换
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
通常,表达式不能包含不同数据类型的值。但是为了使表达式能够进行计算,OceanBase 支持从一个数据类型到另一个数据类型的值的隐式转换和显式转换。
|
||||
|
||||
隐式数据类型转换
|
||||
--------------------
|
||||
|
||||
当转换有意义时,OceanBase 数据库会自动将一个值从一种数据类型转换为另一种数据类型。隐式数据类型的转换规则:
|
||||
|
||||
* `INSERT` 和 `UPDATE` 操作时,OceanBase 把变量值转换成列类型。
|
||||
|
||||
* `SELECT FROM` 操作时,OceanBase 把列数据类型转换成目标变量类型。
|
||||
|
||||
* 字符值和数字值比较时,OceanBase 把字符值转换成数字值。
|
||||
|
||||
|
||||
|
||||
* 在处理数值时,OceanBase 会调整精度和小数位数。由此产生的数字数据类型与基础表中找到的数字数据类型不同。
|
||||
|
||||
|
||||
|
||||
* 字符值或数值和浮点数值之间的转换可以是不精确的,因为字符类型和数量使用十进制精度来表示数值,浮点数使用二进制精度。
|
||||
|
||||
|
||||
|
||||
* 当一个 `CLOB` 值转换为一个字符类型如 `VARCHAR2`,或 `BLOB` 转换为 `RAW` 时。如果要转换的数据大于目标数据类型,那么数据库会返回一个错误。
|
||||
|
||||
|
||||
|
||||
* 在从时间戳值转换为 `DATE` 值的过程中,时间戳值的小数秒部分被截断,且时间戳值的小数秒部分进行四舍五入。
|
||||
|
||||
|
||||
|
||||
* 从 `BINARY_FLOAT` 转换为 `BINARY_DOUBLE` 是准确的。
|
||||
|
||||
|
||||
|
||||
* 如果 `BINARY_DOUBLE` 的精度位数超出了 `BINARY_FLOAT` 支持的位数,`BINARY_DOUBLE` 转换为 `BINARY_FLOAT` 是不精确的。
|
||||
|
||||
|
||||
|
||||
* 当将字符值与 `DATE` 值进行比较时,OceanBase 将字符数据转换为 `DATE`。
|
||||
|
||||
|
||||
|
||||
* 赋值操作时,OceanBase 把等号右边的值转换成左边赋值目标数据类型。
|
||||
|
||||
|
||||
|
||||
* 连接操作时,OceanBase 把非字符类型转换成字符类型或国家字符类型。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**隐式数据类型转换矩阵**
|
||||
|
||||
下表显示了所有的隐式数据类型转换,您不需要考虑转换的方向或转换的上下文。"-"表示不支持转换。
|
||||
|
||||
|
||||
| **数据类型** | **CHAR** | **VARCHAR2** | **NCHAR** | **NVARCHAR2** | **DATE** | **DATETIME / INTERVAL** | **NUMBER** | **BINARY_FLOAT** | **BINARY_DOUBLE** | **RAW** | **CLOB** | **BLOB** |
|
||||
|---------------------|----------|--------------|-----------|---------------|----------|------------------------------------|------------|------------------|-------------------|---------|----------|----------|
|
||||
| CHAR | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
|
||||
| VARCHAR2 | Yes | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
|
||||
| NCHAR | Yes | Yes | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
|
||||
| NVARCHAR2 | Yes | Yes | Yes | - | Yes | Yes | Yes | Yes | Yes | Yes | Yes | - |
|
||||
| DATE | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | - |
|
||||
| DATETIME / INTERVAL | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | - |
|
||||
| NUMBER | Yes | Yes | Yes | Yes | - | - | - | Yes | Yes | - | - | - |
|
||||
| BINARY_FLOAT | Yes | Yes | Yes | Yes | - | - | Yes | - | Yes | - | - | - |
|
||||
| BINARY_DOUBLE | Yes | Yes | Yes | Yes | - | - | Yes | Yes | - | - | - | - |
|
||||
| RAW | Yes | Yes | Yes | Yes | - | Yes ^[1](#note-1)^ | - | - | - | - | Yes | - |
|
||||
| CLOB | Yes | Yes | Yes | Yes | - | - | - | - | - | - | - | Yes |
|
||||
| BLOB | - | - | - | - | - | - | - | - | - | Yes | - | - |
|
||||
|
||||
|
||||
|
||||
^[1]()^ 您不能直接将 `RAW` 转换为 `INTERVAL`,但是可以使用 `UTL_RAW.CAST_TO_VARCHAR2([RAW])` 将`RAW` 转换为 `VARCHAR2`,然后将所得的 `VARCHAR2` 值转换为 `INTERVAL`。
|
||||
|
||||
**不同字符类型之间隐式转换的方向**
|
||||
|
||||
|
||||
| **数据类型** | **TO_CHAR** | **TO_VARCHAR2** | **TO_NCHAR** | **TO_NVARCHAR2** |
|
||||
|----------------|-------------|-----------------|--------------|------------------|
|
||||
| from CHAR | - | VARCHAR2 | NCHAR | NVARCHAR2 |
|
||||
| from VARCHAR2 | VARCHAR2 | - | NVARCHAR2 | NVARCHAR2 |
|
||||
| from NCHAR | NCHAR | NCHAR | - | NCHAR2 |
|
||||
| from NVARCHAR2 | NVARCHAR2 | NVARCHAR2 | NVARCHAR2 | - |
|
||||
|
||||
|
||||
|
||||
**隐式数据类型转换示例**
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT 5 * 10 + 'james' FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
语句执行失败,且您收到以下报错:
|
||||
|
||||
```javascript
|
||||
invalid number
|
||||
```
|
||||
|
||||
|
||||
|
||||
这是由于 OceanBase 使用了隐式数据类型转换,将 `'james'` 转换为数字类型,但是转换失败。
|
||||
|
||||
本示例将字符串 **'2'** 从 `CHAR` 数据类型隐式转换为了数字数据类型 **2** ,计算结果为 **52** 。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT 5 * 10 + '2' FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+---------------------+
|
||||
| 5 * 10 + '2' |
|
||||
+---------------------+
|
||||
| 52 |
|
||||
+---------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
显式数据类型转换
|
||||
--------------------
|
||||
|
||||
您可以使用 SQL 转换函数转换数据类型,SQL 函数显式转换一个数据类型为另一个数据类型。
|
||||
|
||||
**显示类型转换矩阵**
|
||||
|
||||
|
||||
| **数据类型** | **To CHAR、VARCHAR2、NCHAR、NVARCHAR2** | **To NUMBER** | **To Datetime/ Interval** | **To RAW** | **To CLOB、BLOB** | **To_BINARY_FLOAT** | **To_BINARY_DOUBLE** |
|
||||
|----------------------------------------|--------------------------------------|---------------|------------------------------------------------------------------|------------|------------------|---------------------|----------------------|
|
||||
| **From CHAR、VARCHAR2、NCHAR、NVARCHAR2** | TO_CHAR(char . ) 、TO_NCHAR(char . ) | TO_NUMBER | TO_DATE、TO_TIMESTAMP、TO_TIMESTAMP_TZ、TO_YMINTERVAL、TO_DSINTERVAL | HEXTORAW | TO_CLOB | TO_BINARY_FLOAT | TO_BINARY_DOUBLE |
|
||||
| **From NUMBER** | TO_CHAR(number) 、TO_NCHAR(number) | -- | TO_DATE、NUMTOYM_INTERVAL、NUMTOOLS_INTERVAL | -- | -- | TO_BINARY_FLOAT | TO_BINARY_DOUBLE |
|
||||
| **From Datetime/Interval** | TO_CHAR(date ) 、TO_NCHAR(date) | -- | -- | -- | -- | -- | -- |
|
||||
| **From RAW** | RAWTOHEX、RAWTONHEX | -- | -- | -- | TO_BLOB | -- | -- |
|
||||
| **From CLOB、BLOB** | TO_CHAR、TO_NCHAR | -- | -- | -- | TO_CLOB | -- | -- |
|
||||
| **From BINARY_FLOAT** | TO_CHAR(char . ) 、TO_NCHAR(char . ) | TO_NUMBER | -- | -- | -- | TO_BINARY_FLOAT | TO_BINARY_DOUBLE |
|
||||
| **From BINARY_DOUBLE** | TO_CHAR(char . ) 、TO_NCHAR(char . ) | TO_NUMBER | -- | -- | -- | TO_BINARY_FLOAT | TO_BINARY_DOUBLE |
|
||||
|
||||
|
||||
|
||||
**显式数据类型转换示例**
|
||||
|
||||
当前的时间通过 `TO_CHAR` 函数显式转换为想要的格式输出。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(SYSDATE, 'YYYY_MM_DD') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------------------+
|
||||
| TO_CHAR(SYSDATE,'YYYY_MM_DD') |
|
||||
+-------------------------------+
|
||||
| 2020_02_27 |
|
||||
+-------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
数据转换的安全注意事项
|
||||
================================
|
||||
|
||||
|
||||
|
||||
通过隐式转换或不指定格式模型的显式转换将日期时间值转换为文本时,格式模型由一个全局会话参数定义。根据源数据类型,这些参数名称为 `NLS_DATE_FORMAT`、`NLS_TIMESTAMP_FORMAT` 或 `NLS_TIMESTAMP_TZ_ FORMAT`。这些参数的值可以在客户端环境或 `ALTER SESSION` 语句中指定。
|
||||
|
||||
当不指定格式模型的显式转换对动态构造的 SQL 语句中的日期时间值进行显式转换时,格式模型对会话参数的选择过程会对数据库安全性产生负面影响。
|
||||
|
||||
动态构造的 SQL 语句是指由程序或者存储过程生成的 SQL 语句。执行动态构造的 SQL 语句,需要 OceanBase 内置的 PL 包 `DBMS_SQL` 或与 PL 语句 `EXECUTE IMMEDIATE` 相关,但这些并不是唯一执行动态构造的 SQL 文本的方式。
|
||||
|
||||
如下所示,`start_date` 的数据类型为 `DATE`,使用会话参数 `NLS_DATE_FORMAT` 中指定的格式模型将 `start_date` 的值转换为文本,再将结果传递到 SQL 文本中。日期时间格式模型可以简单地由双引号所包含的文本组成。
|
||||
|
||||
```javascript
|
||||
SELECT last_name FROM employees WHERE hire_date > '' || start_date || '';
|
||||
```
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
为显式转换的格式模型设置全球化参数的用户可以决定上述转换产生了什么文本。
|
||||
|
||||
若 SQL 语句由过程执行,则该过程的执行可能会由于session变量的修改而被SQL注入。当某些过程具有更高权限(例如Definer's Rights Procedure)时,造成的安全方面的影响可能更大。
|
||||
|
@ -1,26 +0,0 @@
|
||||
字面量概述
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
字面量(Literals)是用于表达一个固定值的表示法。许多函数和 SQL 语句都需要指定字面量,字面量也可以作为表达式和条件的一部分。OceanBase 支持以下字面量:
|
||||
|
||||
* 文本字面量
|
||||
|
||||
|
||||
|
||||
* 数值字面量
|
||||
|
||||
|
||||
|
||||
* 日期时间字面量
|
||||
|
||||
|
||||
|
||||
* 间隔字面量
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,30 +0,0 @@
|
||||
文本字面量
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
文本字面量(Text Literals)是使用单引号 `' '` 引起来的字符串,用来在表达式、条件、SQL 函数、SQL 语句中指定字符串的值。
|
||||
|
||||
文本字面量本身具有 `CHAR` 和 `VARCHAR2` 数据类型的属性:
|
||||
|
||||
* 在表达式和条件中,OceanBase 通过使用空白填充的比较语义进行比较,将文本字面量视为数据类型为 `CHAR`。
|
||||
|
||||
|
||||
|
||||
* 指定文本字面量时,`CHAR` 数据类型的值的长度最大是 2000,`VARCHAR2` 数据类型的值的长度最大是 32767。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
以下是一些有效的文本字面量,若要在字符串中表现一个单引号,需要在字符串中的单引号前再插入一个单引号:
|
||||
|
||||
```javascript
|
||||
'Jackie''s raincoat'
|
||||
'Hello'
|
||||
'09-MAR-98'
|
||||
'今天天气很好'
|
||||
```
|
||||
|
||||
|
@ -1,77 +0,0 @@
|
||||
数值字面量
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
数值字面量(Numberic Literals)使用数值字面量指定固定数和浮点数的值。
|
||||
|
||||
整数字面量
|
||||
-----------------
|
||||
|
||||
当表达式、条件、SQL 函数和 SQL 语句中出现整数时,需要用整数(Integer)字面量来指定值。
|
||||
|
||||
下面是一些有效的整数字面量:
|
||||
|
||||
```javascript
|
||||
8
|
||||
+186
|
||||
-15
|
||||
```
|
||||
|
||||
|
||||
|
||||
数字和浮点数字面量
|
||||
---------------------
|
||||
|
||||
当表达式、条件、SQL 函数和 SQL 语句中出现数字时,需要用数字(Number)或浮点字(Floating-Point)面量来指定值。
|
||||
|
||||
以下是一些有效的数字 NUMBER 字面量:
|
||||
|
||||
```javascript
|
||||
12
|
||||
+6.87
|
||||
0.5
|
||||
25e-03
|
||||
-9
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是一些有效的浮点数 Floating-Point 字面量:
|
||||
|
||||
```javascript
|
||||
25f
|
||||
+6.34F
|
||||
0.5d
|
||||
-1D
|
||||
```
|
||||
|
||||
|
||||
|
||||
数字字面量最大可以储存精度为 38 位的数字。如果字面量要求的精度比 `NUMBER`、`BINARY_FLOAT` 或 `BINARY_DOUBLE` 所提供的精度更高,则 OceanBase 将截断该值。如果字面量的范围超出 `NUMBER`、`BINARY_FLOAT` 或 `BINARY_DOUBLE` 支持的范围,则 OceanBase 会抛出错误。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
数值字面量中的小数点分隔符始终是点(.)。在期望数值字面量的地方指定了文本字面量,则该文本字面量被转换为数值字面量。
|
||||
|
||||
在下面的示例中,计算了 **2** 乘以数值字面量 **2.2** 和 **2** 乘以文本字面量 **'3.3'** :
|
||||
|
||||
```javascript
|
||||
SELECT 2*2.2, 2*'3.3' FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+-------+---------+
|
||||
| 2*2.2 | 2*'3.3' |
|
||||
+-------+---------+
|
||||
| 4.4 | 6.6 |
|
||||
+-------+---------+
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,122 +0,0 @@
|
||||
日期字面量
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
日期(DATE)字面量可以通过字符串指定,或者可以使用 `TO_DATE` 函数将字符或数字值转换为日期值。日期字面量是唯一接受用 `TO_DATE` 表达式代替字符串指定值的:
|
||||
|
||||
```javascript
|
||||
TO_DATE('2020-03-25 11:05:00', 'YYYY-MM-DD HH24:MI:SS')
|
||||
```
|
||||
|
||||
|
||||
|
||||
使用日期值指定日期字面量时,必须使用公历的日期值。同时也可以如下所示,使用 ANSI 来指定日期字面量,ANSI 日期字面量不包含时间信息,而且必须使用 **YYYY-MM-DD** 的格式:
|
||||
|
||||
```javascript
|
||||
DATE '2020-03-25'
|
||||
```
|
||||
|
||||
|
||||
|
||||
此外,还可以使用数据库默认日期值来指定日期字面量,当在日期表达式中使用默认值时,OceanBase 会自动将默认日期格式的字符值转换为日期值。数据库的默认日期值由初始化参数 `NLS_DATE_FORMAT` 指定,此示例中默认格式为 **DD-MON-RR** :
|
||||
|
||||
```javascript
|
||||
TO_DATE('25-FEB-20', 'DD-MON-RR')
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果您指定不带时间成分的日期值,则默认时间为午夜(24 小时制 00:00:00 和 12 小时制 12:00:00)。如果指定的日期值不带日期成分,则默认日期为当前月份的第一天。
|
||||
|
||||
OceanBase 数据库中默认的日期格式为 **DD-MON-RR** ,如果需要同时显示时间值,可以通过执行` alter session set NLS_DATE_FORMAT = 'DD-MON-RR HH24:MI:SS';` 命令修改变量 `NLS_DATE_FORMAT` 的值。因此,如果查询 `DATE` 列,则必须在查询中指定时间字段,或确保 `DATE` 列中的时间字段设置为午夜。否则,数据库可能不会返回您期望的查询结果。比如创建一张具有 **id** 列和 **datecol** 日期列的表 **Date_Literals** :
|
||||
|
||||
```javascript
|
||||
CREATE TABLE Date_Literals (id NUMBER, datecol DATE);
|
||||
```
|
||||
|
||||
|
||||
|
||||
在表中插入当前会话的系统日期时间 **SYSDATE** ,此示例使用了 TRUNC 函数将时间字段设置为午夜,`TRUNC` 函数会截取 **SYSDATE** 的日期部分,这样 **datecol** 列中的时间会自动填充默认的午夜时间:
|
||||
|
||||
```javascript
|
||||
INSERT INTO Date_Literals VALUES (1,SYSDATE);
|
||||
INSERT INTO Date_Literals VALUES (2,TRUNC(SYSDATE));
|
||||
```
|
||||
|
||||
|
||||
|
||||
此时表中数据为:
|
||||
|
||||
```javascript
|
||||
+------+---------------------+
|
||||
| id | datecol |
|
||||
+------+---------------------+
|
||||
| 1 | 25-FEB-20 11:28:16 |
|
||||
| 2 | 25-FEB-20 00:00:00 |
|
||||
+------+---------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
当查询中不包含时间信息时,可以在查询中使用大于或小于条件,而不是等于或不等于条件:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM Date_Literals WHERE datecol > TO_DATE('2020-02-24', 'YYYY-MM-DD');
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+------+---------------------+
|
||||
| id | datecol |
|
||||
+------+---------------------+
|
||||
| 1 | 25-FEB-20 11:28:16 |
|
||||
| 2 | 25-FEB-20 00:00:00 |
|
||||
+------+---------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
当使用等于条件时,由于查询中不包含时间信息,所以结果只返回了时间信息为午夜值的日期:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM Date_Literals WHERE datecol = TO_DATE('2020-02-25', 'YYYY-MM-DD');
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+------+---------------------+
|
||||
| id | datecol |
|
||||
+------+---------------------+
|
||||
| 2 | 25-FEB-20 00:00:00 |
|
||||
+------+---------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
反过来,可以过滤掉 **datecol** 列中的时间字段,只查询日期字段:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM Date_Literals WHERE TRUNC(datecol) = DATE '2020-02-25';
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+------+---------------------+
|
||||
| id | detacol |
|
||||
+------+---------------------+
|
||||
| 1 | 25-FEB-20 11:28:16 |
|
||||
| 2 | 25-FEB-20 00:00:00 |
|
||||
+------+---------------------+
|
||||
```
|
||||
|
||||
|
@ -1,88 +0,0 @@
|
||||
时间戳字面量
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
OceanBase 支持以下三种时间戳字面量:
|
||||
|
||||
* TIMESTAMP
|
||||
|
||||
|
||||
|
||||
* TIMESTAMP WITH TIME ZONE
|
||||
|
||||
|
||||
|
||||
* TIMESTAMP WITH LOCAL TIME ZONE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TIMESTAMP 字面量
|
||||
-------------------------
|
||||
|
||||
`TIMESTAMP[(scale)]` 数据类型存储了年、月、日、时、分、秒和小数秒值的值。当指定 TIMESTAMP 字面量时,秒字段最大可以指定精度到第9位的纳秒:
|
||||
|
||||
```javascript
|
||||
TIMESTAMP '2020-02-25 11:26:18.316'
|
||||
```
|
||||
|
||||
|
||||
|
||||
TIMESTAMP WITH TIME ZONE 字面量
|
||||
----------------------------------------
|
||||
|
||||
TIMESTAMP WITH TIME ZONE 字面量是包含时区信息的时间戳字面量。
|
||||
|
||||
`TIMESTAMP [(scale)] WITH TIME ZONE` 数据类型是 `TIMESTAMP[(scale)]` 数据类型的一种变体,它在`TIMESTAMP[(scale)]` 数据类型的基础上还存储时区偏移量或者时区区域名称等信息。在指定 TIMESTAMP WITH TIME ZONE 字面量时,需要指定时区信息并且秒字段最大可以指定精度到第9位的纳秒,以下示例使用时区偏移量指定了时区字段的值:
|
||||
|
||||
```javascript
|
||||
TIMESTAMP '2020-02-25 11:26:18.316 +08:00'
|
||||
```
|
||||
|
||||
|
||||
|
||||
当两个 TIMESTAMP WITH TIME ZONE 字面量中的值表示 GMT 时区的同一时刻,那么尽管它们的时区字段的值不同,它们也被视为相同的字面量。如以下示例所示,GMT-8 时区的早上 8 点和 GMT-5 时区的早上11点其实是同一时刻:
|
||||
|
||||
```javascript
|
||||
TIMESTAMP '2020-04-25 08:26:18.316 -08:00'
|
||||
TIMESTAMP '2020-04-25 11:26:18.316 -05:00'
|
||||
```
|
||||
|
||||
|
||||
|
||||
同样的,在字面量中我们可以使用时区区域名称替换时区偏移量,如下所示的示例中将 **-08:00** 替换为了 **America/Los_Angeles** :
|
||||
|
||||
```javascript
|
||||
TIMESTAMP '2020-02-01 11:00:00 America/Los_Angeles'
|
||||
```
|
||||
|
||||
|
||||
|
||||
由于一些地区有夏令时的转换,为了消除夏令时转换时时间的歧义,在指点字面量的值时可以同时使用 时区区域名称(TZR)和相应的缩写 (TZD)以确保字面量的值为夏令时:
|
||||
|
||||
```javascript
|
||||
TIMESTAMP '2020-06-01 11:00:00 America/Los_Angeles PDT'
|
||||
```
|
||||
|
||||
|
||||
|
||||
TIMESTAMP WITH LOCAL TIME ZONE 字面量
|
||||
----------------------------------------------
|
||||
|
||||
`TIMESTAMP [(scale)] WITH LOCAL TIME ZONE` 数据类型是包含本地时区信息的数据类型。OceanBase 中并没有专门的 TIMESTAMP WITH LOCAL TIME ZONE 字面量,是通过其他有效的日期时间字面量来为`TIMESTAMP [(scale)] WITH LOCAL TIME ZONE` 数据类型赋值的。下表显示了一些可用于将值插入 TIMESTAMP WITH LOCAL TIME ZONE 列的格式,以及查询返回的相应值:
|
||||
|
||||
|
||||
| **INSERT 语句中指定的值** | **查询返回的值** |
|
||||
|----------------------------------------------------|------------------------------|
|
||||
| '25-FEB-20' | 25-FEB-20 00.00.000000 |
|
||||
| SYSTIMESTAMP | 25-FEB-20 14:28:41.264258 |
|
||||
| TO_TIMESTAMP('25-FEB-2020', 'DD-MON-YYYY') | 25-FEB-20 00.00.000000 |
|
||||
| SYSDATE | 25-FEB-20 02.55.29.000000 PM |
|
||||
| TO_DATE('25-FEB-20', 'DD-MON-YYYY') | 25-FEB-20 12.00.00.000000 AM |
|
||||
| TIMESTAMP'2020-02-25 8:00:00 America/Los_Angeles' | 25-FEB-20 08.00.00.000000 AM |
|
||||
|
||||
|
||||
|
@ -1,75 +0,0 @@
|
||||
间隔字面量
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
间隔字面量用来指定一段时间的值。OceanBase 支持两种类型的间隔字面量:
|
||||
|
||||
* INTERVAL YEAR TO MONTH
|
||||
|
||||
|
||||
|
||||
* INTERVA DAY TO SECOND
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
前导字段和尾随字段
|
||||
---------------------
|
||||
|
||||
每种间隔字面量都包含一个前导字段和一个可选的尾随字段。前导字段定义了要测量的日期或时间的基本单位,尾随字段定义了所考虑的基本单位的最小增量。例如,DAY TO MINUTE 用来指定最小单位到月份的间隔字面量,其中前导字段是 `YEAR`,尾随字段是 `MINUTE`。尾随字段是可选的,在指定间隔字面量时可以省去。
|
||||
|
||||
在间隔字面量中有以下字段:`YEAR`、`MONTH`、`DAY`、`HOUR`、`MINUTE` 和 `SECOND`。它们的权重从 `YEAR` 开始按顺序递减。当需要指定尾随字段时,字面量中尾随字段的权重一定要低于前导字段,否则是无效的指定。例如,`INTERVAL '1-2' DAY TO YEAR` 是个无效的字面量。
|
||||
|
||||
前导字段值的位数范围为 0\~9,默认值为 2。`SECOND` 字段指定了秒数,该字段最大可以精确到小数点后 9 位,最小是小数点 0 位,默认值精度是小数点 6 位。字段的值超出指定的范围后,数据库会返回错误。`SECOND` 字段的小数位数如果超出指定精度,会四舍五入到符合指定精度的值。
|
||||
|
||||
INTERVAL YEAR TO MONTH 字面量
|
||||
--------------------------------------
|
||||
|
||||
`INTERVAL YEAR TO MONTH` 字面量用来指定以年和月为单位的一段时间。
|
||||
|
||||
以下是一些 `INTERVAL YEAR TO MONTH` 字面量的示例:
|
||||
|
||||
|
||||
| 示例 | 说明 |
|
||||
|-----------------------------------|-------------------------------------------------------|
|
||||
| INTERVAL '265-2' YEAR(3) TO MONTH | 间隔 265 年 2 个月。前导字段 `YEAR` 的精度大于默认的 2 位,需要指定与值位数相符的精度值 |
|
||||
| INTERVAL '265' YEAR(3) | 表示间隔 265 年。 |
|
||||
| INTERVAL '500' MONTH(3) | 表示间隔 500 个月或 41 年 8 个月。 |
|
||||
| INTERVAL '10' MONTH | 表示隔 10 个月。 |
|
||||
| INTERVAL '123' YEAR | 返回错误,值 123 超出了默认精度 2 位。 |
|
||||
|
||||
|
||||
|
||||
可以在一个 `INTERVAL YEAR TO MONTH` 字面量之间添加或减去另一个 `INTERVAL YEAR TO MONTH` 字面量。例如:`INTERVAL '6-2' YEAR TO MONTH` + `INTERVAL'21' MONTH` = `INTERVAL '7-11' YEAR TO MONTH`。
|
||||
|
||||
INTERVAL DAY TO SECOND 字面量
|
||||
--------------------------------------
|
||||
|
||||
`INTERVAL DAY TO SECOND` 字面量用来指定以天和具体时间为单位的一段时间。
|
||||
|
||||
以下是一些 `INTERVAL DAY TO SECOND` 字面量的示例:
|
||||
|
||||
|
||||
| 示例 | 说明 |
|
||||
|-----------------------------------------------|-----------------------------------------------------------------------------------------------------|
|
||||
| INTERVAL '4 5:12:10.222' DAY TO SECOND(3) | 表示间隔 4 天 5 小时 12 分钟 10.222 秒。 `SECOND` 字段小数点默认精度是 6,这里如果不手动指定精度为 3,返回的结果中会用 0 补齐位数。 |
|
||||
| INTERVAL '4 5:12' DAY TO MINUTE | 表示间隔 4 天 5 小时 12 分钟 |
|
||||
| INTERVAL '400 5' DAY(3) TO HOUR | 表示间隔 400 天 5 小时。前导字段 `DAY` 超出默认精度 2 位,这里手动指定精度为 3。 |
|
||||
| INTERVAL '400' DAY(3) | 表示间隔 400 天。 |
|
||||
| INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) | 表示间隔 11 小时 12 分钟 10.2222222 秒。 `SECOND` 字段的值超出默认精度 6 位,这里手动指定了和值相符的精度。 |
|
||||
| INTERVAL '11:20' HOUR TO MINUTE | 表示间隔 11 小时 20 分钟。 |
|
||||
| INTERVAL '10' HOUR | 表示间隔 10 小时 |
|
||||
| INTERVAL '10:22' MINUTE TO SECOND | 表示间隔 10 分钟 22 秒。 |
|
||||
| INTERVAL '10' MINUTE | 表示间隔 10 分钟。 |
|
||||
| INTERVAL '4' DAY | 表示间隔 4 天。 |
|
||||
| INTERVAL '25' HOUR | 表示间隔 25 小时。 |
|
||||
| INTERVAL '40' MINUTE | 表示间隔 40 分钟。 |
|
||||
| INTERVAL '120' HOUR(3) | 表示间隔 120 小时。 |
|
||||
| INTERVAL '30.12345' SECOND(2,4) | 表示间隔 30.1235 秒。秒的小数点位数超出指定精度,所以四舍五入到小数点第 4 位。 |
|
||||
|
||||
|
||||
|
||||
可以在一个 `INTERVAL DAY TO SECOND` 字面量之间添加或减去另一个 `INTERVAL DAY TO SECOND` 字面量。例如:`INTERVAL'20' DAY` - `INTERVAL'239' HOUR` = `INTERVAL'10-1' DAY TO SECOND`。
|
@ -1,33 +0,0 @@
|
||||
格式化概述
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
格式化指定了存储在数据库中的日期时间数据或数值数据的格式。当您将字符串转换为日期时间或数字时,格式化会告诉 OceanBase 数据库如何转换并存储该字符串。在 SQL 语句中,您可以通过 `TO_CHAR` 、`TO_NUMBER` 和 `TO_DATE` 等函数的参数来指定:
|
||||
|
||||
* OceanBase 数据库返回值的格式
|
||||
|
||||
|
||||
|
||||
* 存储在数据库中值的格式
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OceanBase 支持以下几种数据格式化:
|
||||
|
||||
**数值格式化**
|
||||
|
||||
数值格式化指定了存储在数据库中的定点数和浮点数的格式。当您需要将 SQL 语句中出现 `NUMBER`,`BINARY_FLOAT` 或 `BINARY_ DOUBLE` 值转换为 `VARCHAR2` 数据类型时,您可以使用函数中的数值格式化。数值格式化是由一个或多个数值格式化元素组成,具体信息请查阅 [数值格式化](../../../11.sql-reference-oracle-mode/3.basic-elements-1/4.format/2.format-1.md)。
|
||||
|
||||
**日期时间格式化**
|
||||
|
||||
日期时间格式化指定了存储在数据库中日期时间数据的格式。日期时间格式化的总长度不能超过 22 个字符。当您需要将非默认格式的字符值转换为日期时间格式的值时,您可以使用函数中的日期时间格式化。日期时间格式化是由一个或多个日期时间格式化元素组成,具体信息请查阅 [日期时间格式化](../../../11.sql-reference-oracle-mode/3.basic-elements-1/4.format/3.date-and-time-formatting.md)。将字符串值转换为日期值,是有一些转换规则,关于规则请查阅 [字符串到日期的转换规则](../../../11.sql-reference-oracle-mode/3.basic-elements-1/4.format/5.conversion-rules-from-string-to-date.md)。
|
||||
|
||||
`RR` 日期时间格式化元素类似于 `YY` 日期时间格式化元素,但它为跨世纪日期值存储提供了额外的灵活性,关于 RR 日式格式化元素,请查阅 [RR 日期时间格式化元素](../../../11.sql-reference-oracle-mode/3.basic-elements-1/4.format/4.rr-date-and-time-format-element.md)。
|
||||
|
||||
**格式化修饰符**
|
||||
|
||||
OceanBase 数据库暂不支持格式化修饰符 `FX` 和 `FM`。
|
@ -1,129 +0,0 @@
|
||||
数值格式化
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
数值格式化指定了存储在数据库中的定点数和浮点数的格式。
|
||||
|
||||
函数中的数值格式化
|
||||
---------------------
|
||||
|
||||
以下数值数据类型转换函数使用了数值格式化:
|
||||
|
||||
* 当表达式、条件、SQL 函数和 SQL 语句中出现 `NUMBER`,`BINARY_FLOAT` 或 `BINARY_ DOUBLE` 时,且您需要它们的值转换为 `VARCHAR2` 数据类型时,需要用 `TO_CHAR` 函数的参数指定这些数值的格式。
|
||||
|
||||
|
||||
|
||||
* 当表达式、条件、SQL 函数和 SQL 语句中出现 `CHAR` 或 `VARCHAR2` 时,如果您需要将他们的值转换为 `NUMBER` 数据类型时,需要用 `TO_NUMBER` 函数的参数(暂不支持 `NLS_NUMERIC_CHARACTERS`)指定这些数值的格式。如果您需要将他们的值转换为 `BINARY_FLOAT` 或 `BINARY_DOUBLE` 时,需要用 `TO_BINARY_FLOAT` 和 `TO_BINARY_DOUBLE` 函数的参数指定数值格式。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
数值格式化会将数值四舍五入,并取有效数字位数。如果某个值的小数位数,左边的有效位数比格式中指定的位数高,则用 `#` 代替该值。如果 `NUMBER` 的正值非常大且无法以指定的格式表示,则使用无穷大符号(〜)替换该值。如果负 `NUMBER` 值非常小且无法用指定的格式表示,则使用负无穷大符号(-〜)替换该值。
|
||||
|
||||
数值格式化的元素
|
||||
--------------------
|
||||
|
||||
与 Oracle 不同,OceanBase 数据库数值格式化元素仅支持标准的数值格式。下表为 OceanBase 数据库支持的数值格式化元素:
|
||||
|
||||
|
||||
| 元素 | 示例 | 说明 |
|
||||
|--------|-----------|---------------------------------------------------------------------|
|
||||
| .(小数点) | 99.99 | 返回一个小数,且小数点在指定位置。 **限制条件** :在数字格式化中,您只能指定一个小数点。 |
|
||||
| 0 | 0999 9990 | 0999 返回前导零。9990 返回尾随零。 |
|
||||
| 9 | 9999 | 返回具有指定位数的值。如果为正,则返回带有有前导空格的数;如果为负,则返回前导负数。前导零返回 0,除了零值,定点数的小数部分返回零。 |
|
||||
|
||||
|
||||
|
||||
如果省略格式参数,会将数值转为足够长的 `VARCHAR2` 以保留其所有的有效数字。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(0, '99.99') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+--------------------+
|
||||
| TO_CHAR(0,'99.99') |
|
||||
+--------------------+
|
||||
| .00 |
|
||||
+--------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
下表显示了对不同数值的 **number** 按照格式化元素 'fmt' 查询得到的结果。
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(number, 'fmt') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
| number | 'fmt' | Result |
|
||||
|----------|---------|------------|
|
||||
| 0 | 99.99 | '.00' |
|
||||
| +0.1 | 99.99 | '.10' |
|
||||
| -0.2 | 99.99 | '-.20' |
|
||||
| 0 | 90.99 | '0.00' |
|
||||
| +0.1 | 90.99 | '0.10' |
|
||||
| -0.2 | 90.99 | '-0.20' |
|
||||
| 0 | 9999 | '0' |
|
||||
| 1 | 9999 | '1' |
|
||||
| +123.456 | 999.999 | '123.456' |
|
||||
| -123.456 | 999.999 | '-123.456' |
|
||||
|
||||
|
||||
|
||||
当省略'fmt'参数的时候:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(123.456) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
显示结果如下:
|
||||
|
||||
```javascript
|
||||
+------------------+
|
||||
| TO_CHAR(123.456) |
|
||||
+------------------+
|
||||
| 123.456 |
|
||||
+------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
当 `TO_CHAR` 结果超过40字节,或者传入参数为 binary_double/binary_float 类型时,结果将被转为科学计数法。
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(12355555555555555555555555555555555555555555555555) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
显示结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------------------------------------------------+
|
||||
| TO_CHAR(12355555555555555555555555555555555555555555555555) |
|
||||
+-------------------------------------------------------------+
|
||||
| 1.2355555555555555555555555555555556E+49 |
|
||||
+-------------------------------------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,264 +0,0 @@
|
||||
日期时间格式化
|
||||
============================
|
||||
|
||||
|
||||
|
||||
日期时间格式化指定了存储在数据库中日期时间数据的格式。日期时间格式化的总长度不能超过 22 个字符。
|
||||
|
||||
函数中的日期时间格式化
|
||||
-----------------------
|
||||
|
||||
日期时间格式化出现在下面的数据类型转换中:
|
||||
|
||||
* 将非默认格式的字符值转换为日期时间值时,需要 `TO_DATE`、`TO_TIMESTAMP` 和 `TO_TIMESTAMP_TZ` 函数的参数指定日期时间的格式。
|
||||
|
||||
|
||||
|
||||
* 将日期时间值转换为非默认格式的字符值时,需要指定 `TO_CHAR` 函数的参数。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
您可以通过以下方式指定日期时间格式。
|
||||
|
||||
* 通过会话参数 `NLS_DATE_FORMAT`、`NLS_TIMESTAMP_FORMAT` 或 `NLS_TIMESTAMP_TZ_FORMAT` 显式指定。
|
||||
|
||||
|
||||
|
||||
* 通过会话参数 `NLS_TERRITORY` 隐式指定。
|
||||
|
||||
|
||||
|
||||
* `ALTER SESSION` 语句更改会话的默认日期时间格式。
|
||||
|
||||
|
||||
|
||||
|
||||
日期时间格式化
|
||||
-------------------
|
||||
|
||||
日期时间格式化由一个或多个日期时间格式化元素组成。OceanBase 数据库支持的格式化元素请查阅 **日期时间格式化元素表** 。
|
||||
|
||||
* 在格式化字符串中,相同的格式化元素不能出现两次,表示类似信息的格式化元素不能组合。例如,您不能在一个格式化字符串中同时使用 `SYYYY` 和 `BC` 元素。
|
||||
|
||||
|
||||
|
||||
* 所有格式化元素都可以在 `TO_CHAR`、`TO_DATE`、`TO_TIMESTAMP` 和 `TO_TIMESTAMP_TZ` 函数中使用。
|
||||
|
||||
|
||||
|
||||
* 日期时间格式化元素 `FF`、`TZD`、`TZH`、`TZM` 和 `TZR` 可以出现在时间戳和间隔格式化中,但不能出现在 `DATE` 格式中。
|
||||
|
||||
|
||||
|
||||
* 许多日期时间格式元素被空白填充或用零填充至指定的长度。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
建议您使用 4 位数的年份元素(`YYYY`),较短的年份元素会影响查询优化,因为年份只能在运行时确定。
|
||||
|
||||
### 日期时间格式化元素表
|
||||
|
||||
|
||||
|
||||
| 元素 | 日期时间函数是否支持? | 说明 |
|
||||
|---------------------|-------------|------------------------------------------------------------------------------|
|
||||
| - / , 。 ; : "文字" | 是 | 标点和引用的文本会在结果中复制。 |
|
||||
| AD A.D. | 是 | 表示公元纪年法,带有或不带有点号。 |
|
||||
| AM A.M. | 是 | 表示上午,带有或不带有点号。 |
|
||||
| BC B.C. | 是 | 表示公元前的年份,带有或不带有点号。 |
|
||||
| D | 是 | 星期几(1-7)。 |
|
||||
| DAY | 是 | 一天的名称。 |
|
||||
| DD | 是 | 每月的一天(1-31)。 |
|
||||
| DDD | 是 | 一年中的某天(1-366)。 |
|
||||
| DL | 是 | 只能打印类似 "Monday, January, 01, 1996" 的固定格式。 |
|
||||
| DS | 是 | 只能打印类似 "10-10-1996" 的固定格式。 |
|
||||
| DY | 是 | 日期的缩写,返回星期值。 |
|
||||
| FF \[1..9\] | 是 | 小数秒。使用数字 1\~9 来指定返回值的小数秒部分的位数。默认为日期时间数据类型指定的精度。在时间戳和间隔格式中有效,但在 `DATE` 格式中无效。 |
|
||||
| FX | 是 | 需要字符数据和格式模型之间的精确匹配。 |
|
||||
| HHHH12 | 是 | 小时(1-12)。12 小时制 |
|
||||
| HH24 | 是 | 小时(0-23)。24 小时制 |
|
||||
| YYYY | 是 | 包含4位数字的年份。 |
|
||||
| MI | 是 | 分钟(0-59)。 |
|
||||
| MM | 是 | 月(01-12;一月份表示为 01 )。 |
|
||||
| MON | 是 | 月份的缩写。 |
|
||||
| MONTH | 是 | 月份名称。 |
|
||||
| PM P.M. | 是 | 表示下午,带有或不带有点号。 |
|
||||
| Q | 是 | 季度(1、2、3、4; 1月-3月是第 1 季度)。 |
|
||||
| RR | 是 | RR 匹配两位数的年份。 |
|
||||
| RRRR | 是 | 年。接受4位或2位输入。 |
|
||||
| SS | 是 | 秒(0-59)。 |
|
||||
| SSSSS | 是 | 午夜后的秒(0-86400)。 |
|
||||
| TZD | 是 | 夏令时信息。TZD 值是带有夏令时信息的缩写时区字符串。在时间戳和间隔格式中有效,但在 `DATE` 格式中无效。 |
|
||||
| TZH | 是 | 时区小时。在时间戳和间隔格式中有效,但在 `DATE` 格式中无效。 |
|
||||
| TZM | 是 | 时区分钟。在时间戳和间隔格式中有效,但在 `DATE` 格式中无效。 |
|
||||
| TZR | 是 | 时区区域信息。在时间戳和间隔格式中有效,但在 `DATE` 格式中无效。 |
|
||||
| X | 是 | 小数点,永远是 '.' 。 |
|
||||
| Y,YYY | 是 | 带逗号的年。 |
|
||||
| YYYYSYYYY | 是 | 4位数字的年份。 S 代表用一个负号表示公元前的日期。 |
|
||||
| YYYYYY | 是 | 年份的后 3、2 或 1 位数字。 |
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
日期时间函数指的是 `TO_CHAR`、`TO_DATE`、`TO_TIMESTAMP` 和 `TO_TIMESTAMP_TZ` 。
|
||||
|
||||
注意,以上转化要求输入的字符串日期能够与格式元素相匹配,否则会报错,例如:
|
||||
|
||||
```javascript
|
||||
obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYYY' ) FROM DUAL;
|
||||
+----------------------------------+
|
||||
| TO_DATE('31AUG2020','DDMONYYYY') |
|
||||
+----------------------------------+
|
||||
| 2020-08-31 00:00:00 |
|
||||
+----------------------------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
OceanBase 数据库中默认的日期格式为 **DD-MON-RR** ,如果要显示为上面的格式,可以通过执行 `alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';` 修改当前会话的日期时间格式。
|
||||
|
||||
当您的格式串漏掉了一些元素时,会得到系统的报错信息:
|
||||
|
||||
```javascript
|
||||
obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYY' ) FROM DUAL;
|
||||
ORA-01830: date format picture ends before converting entire input string
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 日期格式化元素中的大写字母
|
||||
|
||||
拼写出来的单词、缩写词或罗马数字中的大写字母在相应的格式元素中也跟着大写。例如,日期格式元素 `DAY` 产生的 `MONDAY` 也大写,`Day` 和 `Monday` 格式一样,`day` 和 `monday` 格式一样。
|
||||
|
||||
```javascript
|
||||
obclient> SELECT TO_CHAR(sysdate,'mon') AS nowMonth FROM DUAL;
|
||||
+----------+
|
||||
| NOWMONTH |
|
||||
+----------+
|
||||
| mar |
|
||||
+----------+
|
||||
1 row in set (0.00 sec)
|
||||
|
||||
obclient> SELECT TO_CHAR(sysdate,'MON') AS nowMonth FROM DUAL;
|
||||
+----------+
|
||||
| NOWMONTH |
|
||||
+----------+
|
||||
| MAR |
|
||||
+----------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 日期时间格式化中的标点符号和字符字面量
|
||||
|
||||
以下字符需要日期格式化,这些字符出现在返回值中的位置与格式化中字符的位置相同:
|
||||
|
||||
* 标点符号,例如连字符,斜杠,逗号,句号和冒号。
|
||||
|
||||
|
||||
|
||||
* 字符字面量,用双引号引起来。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OceanBase 数据库可以灵活的将字符串转换为日期。当您使用 `TO_DATE` 函数时,若输入字符串中的每个数字元素都包含格式化允许的最大位数,则格式字符串将与输入的字符串匹配。
|
||||
|
||||
* **示例 1** :格式元素 **MM/YY** ,其中 **02** 对应 **MM** , **07** 对应 **YY** 。
|
||||
|
||||
|
||||
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------------------------------------+
|
||||
| TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') |
|
||||
+------------------------------------------+
|
||||
| 02/07 |
|
||||
+------------------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **示例 2** :OceanBase 数据库允许非字母数字字符与格式化中的标点字符匹配, **#** 对应 **/** 。
|
||||
|
||||
|
||||
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------------------------------+
|
||||
| TO_CHAR(TO_DATE('02#07','MM/YY'),'MM/YY') |
|
||||
+-------------------------------------------+
|
||||
| 02/07 |
|
||||
+-------------------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
日期格式化元素与全球化支持
|
||||
-------------------------
|
||||
|
||||
在 OceanBase 数据库中,日期时间格式化元素的语言可以通过参数 `NLS_DATE_LANGUAGE` 和 `NLS_LANGUAGE` 指定。默认值是 `AMERICAN`,不支持修改,所以不支持全球化。
|
||||
|
||||
**示例** :日期时间格式化的语言参数默认是 `American`,不支持其他语言。
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果报错,语言参数不支持。
|
||||
|
||||
```javascript
|
||||
ORA-12702: invalid NLS parameter string used in SQL function
|
||||
```
|
||||
|
||||
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
* [字符串到日期的转换规则](bq7tvb)
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
RR 日期时间格式化元素
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
`RR` 日期时间格式化元素类似于 `YY` 日期时间格式化元素,但它为跨世纪日期值存储提供了额外的灵活性。在 `YY` 日期时间格式化元素里,您需要指定年份的全部数字。而在 `RR` 日期时间格式化元素里,您只需指定年份数字的最后两位数,便可以存储日期值。
|
||||
|
||||
`RR` 日期时间格式化元素与 `TO_DATE` 函数一起使用,返回值的世纪根据指定的两位数字年份和当前年份的最后两位数字而变化。如果 `YY` 日期时间格式化元素与 `TO_DATE` 函数一起使用,则返回的年份始终与当前年份具有相同的世纪。
|
||||
|
||||
如果指定的两位数字年份是 00\~49,当前年份的最后两位数字是 00\~49,则返回的年份与当前年份具有相同的世纪。当前年份的后两位数字是 50\~99,则返回年份的前两位数字为下一个世纪。
|
||||
|
||||
如果指定的两位数字年份是 50\~99,当前年份的后两位数字为 00 到 49,则返回年份的前两位数字为当前年份 的上一个世纪。当前年份的最后两位数字是 50\~99,则返回的年份与当前年份处于同一个世纪。
|
||||
|
||||
如下所示,`RR` 日期时间格式化元素根据前两位数字不同的年份返回相同的值。假设这些查询是在 1950\~1999 年期间发出的,执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year1" ,
|
||||
TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year2" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------+-------+
|
||||
| Year1 | Year2 |
|
||||
+-------+-------+
|
||||
| 1998 | 2017 |
|
||||
+-------+-------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
假设这些查询是在 2000\~2049 年期间发出的,执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year1" ,
|
||||
TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year2" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------+-------+
|
||||
| Year1 | Year2 |
|
||||
+-------+-------+
|
||||
| 1998 | 2017 |
|
||||
+-------+-------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
通过上面 2 个示例的查询结果可见,无论是在 2000 年之前还是之后查询,都将返回相同的值。
|
@ -1,21 +0,0 @@
|
||||
字符串到日期的转换规则
|
||||
================================
|
||||
|
||||
|
||||
|
||||
将字符串值转换为日期值时,会有下列转换规则:
|
||||
|
||||
* 如果指定了数值格式化元素的所有数值(包括前导零点),则可以从日期字符串中省略格式化字符串中包含的标点符号。为两位数格式化元素(如 `MM`、`DD` 和 `YY`)指定 02 而不是 2。
|
||||
|
||||
|
||||
|
||||
* 您可以从日期字符串中省略在格式化字符串末尾找到的时间字段。
|
||||
|
||||
|
||||
|
||||
* 您可以在日期字符串中使用任何非字母数值字符来匹配格式化字符串中的标点符号。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
空值概述
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
空值(Null)指数据库表中无效的、未指定的、未知的或不可预知的值。空值的出现不受 `NOT NULL` 或 `PRIMARY KEY` 主键约束。任何包含 `NULL` 的算术表达式结果都为 `NULL` 。
|
||||
|
||||
OceanBase 支持以下 3 种空值类型。
|
||||
|
||||
**SQL 函数中的空值**
|
||||
|
||||
SQL 函数中的空值 指的是 SQL 函数的参数为空值,当 SQL 函数的参数为空值时,大多数标量函数都返回 `NULL`,分析函数会忽略空值。此类别中有以下两种 SQL 函数:
|
||||
|
||||
|
||||
| 空值 | 说明 |
|
||||
|------------|-----------------------------------------------------------------------|
|
||||
| NVL 函数中的空值 | 在表达式中 `NVL(expr1,expr2)`中,如果 `expr1` 不是 NULL,返回 `expr1`,否则返回 `expr2`。 |
|
||||
| 分析函数中的空值 | 使用 `AVG`、`MAX`、`SUM` 或 `COUNT` 等分析函数时,为 NULL 的纪录会被忽略。 |
|
||||
|
||||
|
||||
|
||||
**比较条件中的空值**
|
||||
|
||||
比较条件中的空值 指与任何其他条件做比较的 `NULL` 。测试空值只能用比较运算符 `IS NULL` 和 `IS NOT NULL` 。因为 `NULL` 表示缺少数据,所以 `NULL` 和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身。
|
||||
|
||||
**条件判断表达式中的空值**
|
||||
|
||||
条件判断表达式中的空值 指的是条件 `= NULL`、`!= NULL`、 `NULL =`、`NULL !=` 中的 `NULL`,作逻辑判断使用,判断结果不返回任何行,即 `UNKNOWN`。
|
@ -1,88 +0,0 @@
|
||||
SQL 函数中的空值
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
SQL 函数中的空值指的是 SQL 函数的参数存在空值,当 SQL 函数的参数为空值时,大多数标量函数都返回 `NULL`,分析函数会忽略空值。您可以通过 `NVL` 函数的返回值确定空值。
|
||||
|
||||
NVL 函数中的空值
|
||||
----------------------
|
||||
|
||||
`NVL` 函数的表达式为 `NVL(expr1,expr2)`,如果 `expr1` 不是 `NULL`,返回 `expr1`,否则返回 `expr2`。
|
||||
|
||||
如下所示,给定 `expr1` 参数为 `NULL`,查询 `NVL(expr1,0)` 表达式的返回值。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT NVL(NULL,0) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------+
|
||||
| NVL(NULL,0) |
|
||||
+-------------+
|
||||
| 0 |
|
||||
+-------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
`expr1` 是 `NULL`,则表达式 `NVL(expr1,0)` 的返回值为 0;`expr1` 不是 `NULL`,则表达式的返回值为 `expr1`。
|
||||
|
||||
分析函数中的空值
|
||||
--------------------
|
||||
|
||||
在使用 `AVG`,`MAX`,`SUM`,`COUNT` 等分析函数时,为 `NULL` 的纪录会被忽略。
|
||||
|
||||
如下所示,向 **tbl_a** 表中插入数据并执行以下语句:
|
||||
|
||||
```javascript
|
||||
CREATE TABLE tbl_a (col_a varchar2(1), col_b int );
|
||||
INSERT INTO tbl_a VALUES (NULL, 3);
|
||||
INSERT INTO tbl_a VALUES (NULL, NULL);
|
||||
INSERT INTO tbl_a VALUES (NULL, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM tbl_a;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------+-------+
|
||||
| COL_A | COL_B |
|
||||
+-------+-------+
|
||||
| NULL | 3 |
|
||||
| NULL | NULL |
|
||||
| NULL | 1 |
|
||||
+-------+-------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询的结果如下:
|
||||
|
||||
```javascript
|
||||
SELECT AVG(col_b) FROM tbl_a; -- 结果为 2 ,
|
||||
SELECT MAX(col_b) FROM tbl_a; -- 结果为 3
|
||||
SELECT SUM(col_b) FROM tbl_a; -- 结果为 4
|
||||
SELECT COUNT(col_b) FROM tbl_a; -- 结果为 2
|
||||
SELECT COUNT(col_a) FROM tbl_a; -- 结果为 0
|
||||
SELECT COUNT(*) FROM tbl_a; -- 结果为 3
|
||||
```
|
||||
|
||||
|
||||
|
||||
`NULL` 的纪录被忽略了。
|
@ -1,21 +0,0 @@
|
||||
比较条件中的空值
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
比较条件中的空值指与任何其他条件做比较的 `NULL`。测试空值只能用比较运算符 `IS NULL` 和 `IS NOT NULL` 。因为 `NULL` 表示缺少数据,所以 `NULL` 和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身。
|
||||
|
||||
另外,OceanBase 数据库在计算 `DECODE` 函数时认为两个空值是相等的。若两个空值出现在复合键中,则它们也相等。
|
||||
|
||||
如下所示,根据 A 值判断比较条件的结果。
|
||||
|
||||
|
||||
| 条件 | A 值 | 结果 |
|
||||
|---------------|------|-------|
|
||||
| A IS NULL | 10 | FALSE |
|
||||
| A IS NOT NULL | 10 | TRUE |
|
||||
| A IS NULL | NULL | TRUE |
|
||||
| A IS NOT NULL | NULL | FALSE |
|
||||
|
||||
|
||||
|
@ -1,24 +0,0 @@
|
||||
条件判断表达式中的空值
|
||||
================================
|
||||
|
||||
|
||||
|
||||
条件判断表达式中的空值指的是条件 `= NULL`、`!= NULL`、 `NULL =`、`NULL !=` 中的 `NULL`,作逻辑判断使用,判断结果不返回任何行,即 `UNKNOWN`。
|
||||
|
||||
在 OceanBase 中,测试空值要用比较运算符 `IS NULL` ,返回结果为 `TRUE` 或 `FALSE` 。但是条件判断表达式中空值的判断结果 `UNKNOWN` 与 `FALSE` 不同,`NOT FALSE` 判断结果为 `TRUE`, `NOT UNKNOWN` 判断结果仍然为 `UNKNOWN`。
|
||||
|
||||
如下所示,根据 A 值判断条件判断表达式的结果。
|
||||
|
||||
|
||||
| 条件 | A 值 | 结果 |
|
||||
|-----------|------|---------|
|
||||
| A = NULL | 10 | UNKNOWN |
|
||||
| A != NULL | 10 | UNKNOWN |
|
||||
| A = NULL | NULL | UNKNOWN |
|
||||
| A != NULL | NULL | UNKNOWN |
|
||||
| A = 10 | NULL | UNKNOWN |
|
||||
| A != 10 | NULL | UNKNOWN |
|
||||
|
||||
|
||||
|
||||
如果在 `SELECT` 语句的 `WHERE` 子句中使用了判断结果为 `UNKNOWN` 的条件,则该查询将不返回任何行。
|
@ -1,21 +0,0 @@
|
||||
注释概述
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
OceanBase 中用户可以创建三种注释:
|
||||
|
||||
* [SQL 语句的注释](../../../11.sql-reference-oracle-mode/3.basic-elements-1/6.annotation-1/2.comments-on-the-sql-statement.md):被存储为执行 SQL 语句的应用程序代码的一部分。
|
||||
|
||||
|
||||
|
||||
* [Schema 与非 Schema 对象的注释](../../../11.sql-reference-oracle-mode/3.basic-elements-1/6.annotation-1/3.comment-on-schema-and-non-schema-objects.md):与对象本身的元数据一起存储在数据字典中。
|
||||
|
||||
|
||||
|
||||
* [Hint](../../../11.sql-reference-oracle-mode/3.basic-elements-1/6.annotation-1/4.Hint/1.hint-overview.md):一种在 SQL 语句中将指令传递给 OceanBase 数据库优化器的注释。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,64 +0,0 @@
|
||||
SQL 语句的注释
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
注释可以使应用程序更易于阅读和维护。例如,您可以在语句中用注释以描述该语句在应用程序中的用途。除 Hint 外,SQL 语句中的注释不会影响语句的执行。
|
||||
|
||||
注释可以出现在语句中的任何关键字、参数或标点符号之间。您可以通过两种方式在语句中添加注释:
|
||||
|
||||
* 以斜杠和星号(/\*)为开头的注释。斜杠和星号后跟着注释的文本。此文本可以跨越多行,并用星号和斜杠(\*/)结束注释。开头和结尾的符号不必与文本用空格或换行符进行分隔。
|
||||
|
||||
|
||||
|
||||
* 以两个连字符(--)为开头的注释。符号后跟着注释的文本。此文本不能扩展到新行,并以换行符结束注释。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
一个 SQL 语句可以同时包含这两种风格的多个注释。注释的文本可以包含数据库字符集中的任何可打印字符。
|
||||
|
||||
以下示例展示了多种形式的以斜杠和星号(/\*)为开头的注释:
|
||||
|
||||
```javascript
|
||||
SELECT last_name, employee_id, salary + NVL(commission_pct, 0),
|
||||
job_id, e.department_id
|
||||
/* Select all employees whose compensation is
|
||||
greater than that of Pataballa.*/
|
||||
FROM employees e, departments d
|
||||
/*The DEPARTMENTS table is used to get the department name.*/
|
||||
WHERE e.department_id = d.department_id
|
||||
AND salary + NVL(commission_pct,0) > /* Subquery: */
|
||||
(SELECT salary + NVL(commission_pct,0)
|
||||
/* total compensation is salary + commission_pct */
|
||||
FROM employees
|
||||
WHERE last_name = 'Pataballa')
|
||||
ORDER BY last_name, employee_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下示例中的语句包含多种形式的以两个连字符(- -)为开头的注释:
|
||||
|
||||
```javascript
|
||||
SELECT last_name, -- select the name
|
||||
employee_id -- employee id
|
||||
salary + NVL(commission_pct, 0), -- total compensation
|
||||
job_id, -- job
|
||||
e.department_id -- and department
|
||||
FROM employees e, -- of all employees
|
||||
departments d
|
||||
WHERE e.department_id = d.department_id
|
||||
AND salary + NVL(commission_pct, 0) > -- whose compensation
|
||||
-- is greater than
|
||||
(SELECT salary + NVL(commission_pct,0) -- the compensation
|
||||
FROM employees
|
||||
WHERE last_name = 'Pataballa') -- of Pataballa
|
||||
ORDER BY last_name -- and order by last name
|
||||
employee_id -- and employee id.
|
||||
;
|
||||
```
|
||||
|
||||
|
@ -1,43 +0,0 @@
|
||||
Schema 与非 Schema 对象的注释
|
||||
===========================================
|
||||
|
||||
|
||||
|
||||
可以使用 `COMMENT` 语句将注释与 Schema 对象(表、视图、物化视图、运算符、索引类型)或非 Schema 对象(Edition)关联起来。还可以在表模式对象的列上创建注释。与 Schema 和非 Schema 对象关联的注释存储在数据字典中。
|
||||
|
||||
语法格式
|
||||
-------------------------
|
||||
|
||||
```javascript
|
||||
COMMENT ON {TABLE table | COLUMN column | INDEXTYPE indextype
|
||||
| OPERATOR operator | VIEW view} IS string
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 对 user 表注释
|
||||
|
||||
```unknow
|
||||
COMMENT ON TABLE test.user is "这是记录用户信息的表";
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 对 user_name 列注释
|
||||
|
||||
```unknow
|
||||
COMMENT ON COLUMN test.user.user_name is "这里记录了用户的姓名";
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,102 +0,0 @@
|
||||
Hint 概述
|
||||
============================
|
||||
|
||||
|
||||
|
||||
Hint 是 SQL 语句中将指令传递给 OceanBase 数据库优化器或服务器的一种注释。通过 Hint 可以使优化器或服务器生成某种特定的计划。 一般情况下,优化器会为用户查询选择最佳的执行计划,不需要用户主动使用 Hint 指定,但在某些场景下,优化器生成的执行计划可能不满足用户的要求,这时就需要用户使用 Hint 来主动指定并生成特殊的执行计划。
|
||||
|
||||
Hint 应该少用,仅在您收集了相关表的统计信息并且使用 `EXPLAIN PLAN` 语句在没有 Hint 的情况下评估了优化器计划之后,才谨慎考虑使用。更改数据库条件以及在后续版本中增强查询性能可能会导致您代码中的 Hint 对性能产生重大影响。
|
||||
|
||||
Hint 的使用
|
||||
--------------------
|
||||
|
||||
一个语句块只能有一个注释包含 Hint,并且该注释必须跟随 `SELECT`、`UPDATE`、`INSERT`、`MERGE` 或 `DELETE` 关键字。
|
||||
|
||||
以下是 Hint 在语句块注释中的语法格式:
|
||||
|
||||
```javascript
|
||||
/*+[hint text]*/
|
||||
```
|
||||
|
||||
|
||||
|
||||
Hint 从语法上看是一种特殊的 SQL 注释, 所不同的是在注释的左标记后增加了一个加号(+)。 如果服务器端无法识别 SQL 语句中的 Hint,那么优化器会选择忽略用户指定的 Hint 而使用默认计划所生成逻辑。另外需要指明的是,Hint 只影响优化器所生成的计划的逻辑,而不影响 SQL 语句的语义。
|
||||
|
||||
以下是定义 Hint 时需要注意的一些规则:
|
||||
|
||||
* 加号(+)使数据库将注释解释为 Hint 列表。加号必须紧跟在注释左标记符后,不允许有空格。
|
||||
|
||||
|
||||
|
||||
* 加号(+)和 Hint 文本之间的空格是可选的。如果注释中包含多个 Hint,则 Hint 间至少用一个空格进行分隔。
|
||||
|
||||
|
||||
|
||||
* Hint 包含拼写错误或语法错误时会被忽略。但是,数据库会考虑在同一注释中其他正确指定的 Hint。
|
||||
|
||||
|
||||
|
||||
* 不跟随 `DELETE`、`INSERT`、`MERGE`、`SELECT` 或 `UPDATE` 关键字的 Hint 无效。
|
||||
|
||||
|
||||
|
||||
* Hint 的组合相互冲突时 Hint 无效。但是,数据库会在同一注释中考虑其他不冲突的 Hint。
|
||||
|
||||
|
||||
|
||||
* 数据库环境使用 PL/SQL 版本 1 时 Hint 无效,例如 Forms 版本 3 触发器。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
在 Hint 中定义查询块
|
||||
-------------------------
|
||||
|
||||
您可以通过在许多 Hint 中定义一个可选的查询块名称,以此来指定该 Hint 适用的查询块。使用此语法,允许您在外部查询中指定一个应用于嵌入式视图的 Hint。
|
||||
|
||||
查询块参数的语法格式为 `@queryblock`,其中 `queryblock` 是在查询中被指定的查询块的标识符。`queryblock` 标识符可以是系统生成的,也可以是用户自己指定的。当您在查询块中直接指定要应用的 Hint 时,将忽略 `@queryblock`。
|
||||
|
||||
* 系统生成的标识符可以通过对查询使用 `EXPLAIN PLAN` 生成,预转换查询块的名称可以通过对使用了 `NO_QUERY_TRANSFORMATION` Hint 的查询运行 `EXPLAIN PLAN` 生成。
|
||||
|
||||
|
||||
|
||||
* 可以使用 QB_NAME 来指定用户自定义的名称。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
定义全局 Hint
|
||||
---------------------
|
||||
|
||||
许多 Hint 既可以应用于特定的表或索引,也可以更全局地应用于视图中的表或一部分索引的列。语法元素 `tablespec` 和 `indexspec` 定义了这些全局 Hint。
|
||||
|
||||
以下是 `tablespec` 的语法:
|
||||
|
||||
```javascript
|
||||
[ view.[ view. ]... ]table
|
||||
```
|
||||
|
||||
|
||||
|
||||
您必须完全按照在语句中显示的方式来指定要访问的表。如果该语句使用表的别名,则在 Hint 中使用也使用别名而不是表名。但是,即使 Schema 名称出现在语句中,也不要在 Hint 中使用的表名中包含 Schema 名称。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
使用 `tablespec` 子句指定全局 Hint 对于使用 ANSI 连接的查询不起作用,因为优化器在解析期间会生成额外的视图。相反,可以通过 `@queryblock` 来指定该提示所应用到的查询块。
|
||||
|
||||
以下是 `indexspec` 的语法:
|
||||
|
||||
```javascript
|
||||
{ index
|
||||
| ( [ table. ]column [ [ table. ]column ]...)
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
在 Hint 的说明部分,当 `tablespec` 后跟着 `indexspec` 时,允许但不要求使用逗号来分隔表名和索引名。也允许(但不是必需)使用逗号分隔多次出现的 `indexspec`。
|
@ -1,71 +0,0 @@
|
||||
与访问路径相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
INDEX Hint
|
||||
----------------------
|
||||
|
||||
`INDEX` Hint 指示优化器对指定的表使用索引扫描。您可以将 `INDEX` Hint 用于基于函数、域、B - 树、位图和位图连接的索引。
|
||||
|
||||
以下是 `INDEX` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ INDEX ( [ @ queryblock ] tablespec [ indexspec [ indexspec ]... ] ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
Hint 的行为取决于 `indexspec` 规范:
|
||||
|
||||
* 如果 `INDEX` Hint 指定了一个单个可用索引,则数据库将对该索引执行扫描。优化器不考虑全表扫描或表上另一个索引的扫描。
|
||||
|
||||
|
||||
|
||||
* 如果 `INDEX` Hint 指定了可用索引的列表,那么优化器将考虑扫描列表中每个索引的成本,然后以最低的成本执行索引扫描。如果数据库从这个列表中扫描多个索引并合的访问路径成本最低,数据库将选用这种扫描方案。数据库不考虑对没有在列表中的索引进行全表扫描或扫描。
|
||||
|
||||
|
||||
|
||||
* 如果 `INDEX` Hint 没有指定具体的索引,那么优化器将考虑表上每个可用索引的扫描成本,然后以最低的成本执行索引扫描。如果数据库扫描多个索引并合的访问路径成本最低,数据库将选用这种扫描方案。优化器不考虑全表扫描。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id
|
||||
FROM employees
|
||||
WHERE department_id > 50;
|
||||
```
|
||||
|
||||
|
||||
|
||||
FULL Hint
|
||||
---------------------
|
||||
|
||||
`FULL` Hint 指示优化器对指定的表执行全表扫描。
|
||||
|
||||
以下是 `FULL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ FULL ( [ @ queryblock ] tablespec ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ FULL(e) */ employee_id, last_name
|
||||
FROM hr.employees e
|
||||
WHERE last_name LIKE :b1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
数据库对表 **employees** 执行一次完整的表扫描来执行这条语句,即使有一个由 `WHERE` 子句中的条件提供的索引在列 **last_name** 上。
|
||||
|
||||
在 `FROM` 子句中,表 **employees** 有个别名 **e** ,因此 Hint 必须根据表的别名而不是名称来引用该表。即使在 `FROM` 子句中指定了 Schema 名,也不要在 Hint 中引用它们。
|
@ -1,46 +0,0 @@
|
||||
与联接顺序相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
LEADING Hint
|
||||
---------------------
|
||||
|
||||
`LEADING` Hint 指示优化器在执行计划中使用指定的表集作为前缀,它可以用来指定表的联接顺序。这个 Hint 比 `ORDERED` Hint 更通用。
|
||||
|
||||
以下是 `LEADING` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ LEADING ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
`LEADING` Hint 为确保按照用户指定的顺序联接表,所以会进行严格的检查。如果发现 Hint 指定的 `table_name` 不存在,则 `LEADING` Hint 失效。如果发现 Hint 中存在重复表,则 `LEADING` Hint 失效。如果在优化器联接期间,无法找到对应的表,那么该表及后面的表指定的联接顺序失效,该表前面指定的顺序依然有效。如果由于联接图中的依赖关系,无法首先按照指定的顺序联接指定的表,则 `LEADING` Hint 失效。如果指定两个或多个相互冲突的 `LEADING` Hint,则 `LEADING` Hint 失效。如果您指定了 `ORDERED` Hint,它将覆盖所有的 `LEADING` Hint。
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ LEADING(e j) */ *
|
||||
FROM employees e, departments d, job_history j
|
||||
WHERE e.department_id = d.department_id
|
||||
AND e.hire_date = j.start_date;
|
||||
```
|
||||
|
||||
|
||||
|
||||
ORDERED Hint
|
||||
------------------------
|
||||
|
||||
`ORDERED` Hint 指示数据库按照表在 `FROM` 子句中出现的顺序联接表。建议使用 `LEADING` Hint,它比 `ORDERED` Hint 更通用。
|
||||
|
||||
以下是 `ORDERED` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ ORDERED */
|
||||
```
|
||||
|
||||
|
||||
|
||||
当您从需要联接的SQL语句中省略 `ORDERED` Hint 时,将由优化器将选择联接表的顺序。但是优化器不知道从每个表中要选择的行数,此时您可以使用 `ORDERED` Hint 来指定联接顺序。这样使您能够比优化器更好地选择内部表和外部表。如果在指定该 `ORDERED` Hint 后发生了改写,那么就按照改写后的语句中的 `FROM` 子句的顺序联接表。
|
||||
|
@ -1,191 +0,0 @@
|
||||
与联接操作相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
USE_MERGE Hint
|
||||
--------------------------
|
||||
|
||||
`USE_MERGE` Hint 指示优化器使用一个 `sort-merge` 联接将每个指定的表与另一个行资源联接起来。建议在使用 `USE_NL` 和 `USE_MERG` Hint 时和 `LEADING` 与 `ORDERED` Hint 一起使用。当被引用的表是联接的内部表时,优化器将使用这些提示。如果被引用的表是外部表,则忽略 Hint。
|
||||
|
||||
以下是 `USE_MERGE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_MERGE ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
`USE_MERGE` 指定表作为内部表时候使用 MERGE-JOIN 算法。OceanBase 中使用 MERGE-JOIN 算法时必须有等值条件的 `join-condition`,因此无等值条件的两个表做联结时,`USE_MERGE` 失效。
|
||||
|
||||
以下是 `USE_MERGE` 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_MERGE(employees departments) */ *
|
||||
FROM employees, departments
|
||||
WHERE employees.department_id = departments.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_MERGE Hint
|
||||
-----------------------------
|
||||
|
||||
`NO_USE_MERGE` Hint 指示优化器在使用指定表作为内部表并联接到另一个行资源时排除 `USE_MERGE` Hint 使用的联接。
|
||||
|
||||
以下是 `NO_USE_MERGE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_MERGE ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是 `NO_USE_MERGE` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_MERGE(e d) */ *
|
||||
FROM employees e, departments d
|
||||
WHERE e.department_id = d.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_HASH Hint
|
||||
-------------------------
|
||||
|
||||
`USE_HASH` Hint 指示优化器使用 HASH-JOIN 算法将每个指定的表与另一个行资源联接起来。
|
||||
|
||||
以下是 `USE_HASH` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_HASH ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是 `USE_HASH` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_HASH(l h) */ *
|
||||
FROM orders h, order_items l
|
||||
WHERE l.order_id = h.order_id
|
||||
AND l.order_id > 2400;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_HASH Hint
|
||||
----------------------------
|
||||
|
||||
`NO_USE_HASH` Hint 指示优化器在使用指定表作为内部表并联接到另一个行资源时排除 `USE_HASH` Hint 使用的联接。
|
||||
|
||||
以下是 `NO_USE_HASH` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_HASH ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是 `NO_USE_HASH` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_HASH(e d) */ *
|
||||
FROM employees e, departments d
|
||||
WHERE e.department_id = d.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_NL Hint
|
||||
-----------------------
|
||||
|
||||
`USE_NL` Hint 指示优化器使用嵌套循环联接将每个指定的表连接到另一个行资源,并使用指定的表作为内部表,指定表作为内部表时使用 NL-JOIN 算法。建议在使用 `USE_NL` 和 `USE_MERG` Hint 时和 `LEADING` 与 `ORDERED` Hint 一起使用。当被引用的表是联接的内部表时,优化器将使用这些提示。如果被引用的表是外部表,则忽略 Hint。
|
||||
|
||||
以下是 `USE_NL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_NL ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
在下面的示例中,Hint 强制执行了嵌套循环,通过全表扫描访问了 **orders** 并且筛选条件 `l.order_id = h.order_id` 应用在了每一行。对于满足筛选条件的每一行,通过索引 **order_id** 访问 **order_items** :
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_NL(l h) */ h.customer_id, l.unit_price * l.quantity
|
||||
FROM orders h, order_items l
|
||||
WHERE l.order_id = h.order_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_NL Hint
|
||||
--------------------------
|
||||
|
||||
`NO_USE_NL` Hint 指示优化器在使用指定表作为内部表并联接到另一个行资源时排除 Nest-Loop 联接。
|
||||
|
||||
以下是 `NO_USE_NL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_NL ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是 `NO_USE_NL` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_NL(e d) */ *
|
||||
FROM employees e, departments d
|
||||
WHERE e.department_id = d.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_BNL Hint
|
||||
------------------------
|
||||
|
||||
`USE_BNL` Hint 指示优化器使用块嵌套循环联接将每个指定的表连接到另一个行资源,并使用指定的表作为内部表,指定表作为内部表时使用 BNL-JOIN 算法。建议在使用 `USE_BN` Hint 时和 `LEADING` 与 `ORDERED` Hint 一起使用。当被引用的表是联接的内部表时,优化器将使用这些提示。如果被引用的表是外部表,则忽略 Hint。
|
||||
|
||||
以下是 `USE_BNL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_BNL ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
在下面的示例中,Hint 强制执行了块嵌套循环,通过全表扫描访问了 **orders** 并且筛选条件 `l.order_id = h.order_id` 应用在了每一行。对于满足筛选条件的每一行,通过索引 **order_id** 访问 **order_items** :
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_BNL(l h) */ h.customer_id, l.unit_price * l.quantity
|
||||
FROM orders h, order_items l
|
||||
WHERE l.order_id = h.order_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_BNL Hint
|
||||
---------------------------
|
||||
|
||||
`NO_USE_BNL` Hint 指示优化器在使用指定表作为内部表并联接到另一个行资源时排除 `USE_BNL` Hint 使用的联接。
|
||||
|
||||
以下是 `NO_USE_BNL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_BNL ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下是 `NO_USE_BNL` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_BNL(e d) */ *
|
||||
FROM employees e, departments d
|
||||
WHERE e.department_id = d.department_id;
|
||||
```
|
||||
|
||||
|
@ -1,207 +0,0 @@
|
||||
与并行执行相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
PARALLEL Hint
|
||||
-------------------------
|
||||
|
||||
`PARALLEL` Hint 是语句级的 Hint,用来指示优化器指定并行操作可使用的并行服务器的数量。此 Hint 将覆盖初始化参数 `PARALLEL_DEGREE_ POLICY` 的值。该 Hint 适用于语句的 `SELECT`、`INSERT`、`MERGE`、`UPDATE` 和 `DELETE` 部分,以及表扫描的部分。如果违反了任何的并行限制,则 `PARALLEL` Hint 被忽略。
|
||||
|
||||
以下是 `PARALLEL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ PARALLEL [ ( DEFAULT | AUTO | MANUAL | integer ) ] */
|
||||
```
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
如果还进行了排序或分组操作,那么可以使用的服务器数量是 `PARALLEL` Hint 中的值的两倍。
|
||||
|
||||
`PARALLE` Hint 中指定参数的值时:
|
||||
|
||||
* `PARALLEL`:数据库计算并行度,可以为 2 或更大。语句一直并行执行。
|
||||
|
||||
* `PARALLEL(DEFAULT)` :优化器计算的并行度等于所有参与实例上可用的 CPU 数量乘以初始化参数 `PARALLEL_THREADS_PER_CPU` 的值。
|
||||
|
||||
* `PARALLEL(AUTO)` :数据库计算并行度,结果可以大于等于 1,如果计算出的并行度为 1,则该语句按顺序运行。
|
||||
|
||||
* `PARALLEL(MANUAL)`:优化器被强制使用语句中设置的对象的并行度。
|
||||
|
||||
* `PARALLEL(integer)`:优化器使用参数 `integer` 指定的整数值为并行度。
|
||||
|
||||
|
||||
|
||||
|
||||
以下示例中数据库计算并行度,并且语句一直并行执行:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ PARALLEL */ last_name
|
||||
FROM employees;
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下示例中数据库计算并行度,但是并行度为 1,所以该语句串行执行:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ PARALLEL (AUTO) */ last_name
|
||||
FROM employees;
|
||||
```
|
||||
|
||||
|
||||
|
||||
在以下示例中,`PARALLEL` Hint 建议优化器使用语句中设定的,当前对表本身有效的并行度 5:
|
||||
|
||||
```javascript
|
||||
CREATE TABLE parallel_table (col1 number, col2 VARCHAR2(10)) PARALLEL 5;
|
||||
SELECT /*+ PARALLEL (MANUAL) */ col2
|
||||
FROM parallel_table;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_PX Hint
|
||||
-----------------------
|
||||
|
||||
`USE_PX` Hint 强制指示服务器在执行 SQL 语句时使用 PX 模式,PX 模式允许在执行语句时采用多线程方式。一般 `USE_PX` Hint 和 `PARALLEL` Hint 配合使用。
|
||||
|
||||
以下是 `USE_PX` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_PX */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_PX PARALLEL(4)*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_PX Hint
|
||||
--------------------------
|
||||
|
||||
`NO_USE_PX` Hint 强制指示服务器在执行 SQL 语句时避免使用 PX 模式。
|
||||
|
||||
以下是 `NO_USE_PX` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_PX */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_PX*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
PQ_DISTRIBUTE Hint
|
||||
------------------------------
|
||||
|
||||
`PQ_DISTRIBUTE` Hint 指示优化器怎样在程序(查询)服务器和消耗(负载)查询服务器之间分配行。您可以通过该 Hint 控制联接或负载的行分布`PQ_DISTRIBUTE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ PQ_DISTRIBUTE
|
||||
( [ @ queryblock ] tablespec
|
||||
{ distribution | outer_distribution inner_distribution }
|
||||
) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 控制负载的分配
|
||||
|
||||
您可以控制并行语句 `INSERT ... SELECT` 和并行语句 `CREATE TABLE ... AS SELECT` 的行分布,以此来确定如何在程序(查询)服务器和消耗(负载)服务器之间进行行分配。使用语法的上分支来指定分发方法。分布方法的值及其语义如下表所示:
|
||||
|
||||
|
||||
| 分布方法 | 说明 |
|
||||
|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| NONE | 没有分配。即将查询和负载操作组合到每个查询服务器中。所有服务器将加载所有分区。这种分配方法的缺失有助于避免在没有偏离的情况下行分配的开销。由于空段或语句中的谓词会过滤掉查询评估的所有行,因此可能会发生偏离。如果由于使用此方法而发生偏斜,则请改用 `RANDOM` 或 `RANDOM_ LOCAL` 分布。 **注意** 请谨慎使用此分配方法。每个进程加载的 PGA 内存最少需要 512 KB。如果还使用压缩,则每台服务器消耗大约 1.5 MB 的 PGA 内存。 |
|
||||
| PARTITION | 此方法使用 `tablespec` 的分区信息将行从查询服务器分发到消耗服务器。当不可能或不希望将查询和加载操作组合在一起时和当正在加载的分区数量大于或等于加载服务器的数量并且输入数据将均匀地分布在正在加载的分区之间(即没有偏离)时,请使用此分步方法。 |
|
||||
| RANDOM | 此方法以循环方式将来自程序的行分发给消耗。当输入数据高度倾斜时,使用这种分布方法。 |
|
||||
| RANDOM_LOCAL | 此方法将来自程序的行分布到一组服务器,这些服务器负责维护给定的一组服务器。两个或多个服务器可以加载同一分区,但是没有服务器加载所有分区。当输入数据发生偏移并且由于内存限制而无法合并查询和加载操作时,请使用此分布方法。 |
|
||||
|
||||
|
||||
|
||||
例如,在以下直接装入插入操作中,该操作的查询和负载部分被组合到每个查询服务器中:
|
||||
|
||||
```javascript
|
||||
INSERT /*+ APPEND PARALLEL(target_table, 16) PQ_DISTRIBUTE(target_table, NONE) */
|
||||
INTO target_table
|
||||
SELECT * FROM source_table;
|
||||
```
|
||||
|
||||
|
||||
|
||||
在下面的示例中,创建表时优化器使用表 **target_table** 的分区来分配行:
|
||||
|
||||
```javascript
|
||||
CREATE /*+ PQ_DISTRIBUTE(target_table, PARTITION) */ TABLE target_table
|
||||
NOLOGGING PARALLEL 16
|
||||
PARTITION BY HASH (l_orderkey) PARTITIONS 512
|
||||
AS SELECT * FROM source_table;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 控制联接的分配
|
||||
|
||||
您可以通过指定两种分配方法来控制联接的分配方法,如语法中的下部分支所示,一种外部表的分布方法,一种内部表的分布方法:
|
||||
|
||||
* `outside_distribution` 是外部表的分布方法。
|
||||
|
||||
* `inner_distribution` 是内部表的分布方法。
|
||||
|
||||
|
||||
|
||||
|
||||
分布方法的值是 `HASH`、`BROADCAST`、`PARTITION` 和 `NONE`。只有下表中的 6 种分布方法组合是有效的:
|
||||
|
||||
|
||||
| 分布方法 | 说明 |
|
||||
|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| HASH, HASH | 使用联接键上的哈希函数,将每个表的行映射到消耗查询服务器。映射完成后,每个查询服务器都会在一对结果分区之间执行联接。当表的大小可比较并且联接操作是通过哈希联接或排序合并联接实现时,建议使用此分布方法。 |
|
||||
| BROADCAST, NONE | 外部表的所有行都广播到每个程序查询服务器。内部表行是随机分区的。当外部表与内部表相比非常小时,建议使用此分布方法。通常,当内部表大小乘以查询服务器的数量大于外部表大小时,也建议使用此分布方法。 |
|
||||
| NONE, BROADCAST | 内部表的所有行都广播给每个消耗查询服务器。外部表行是随机分区的。当内部表与外部表相比非常小时,建议使用此分布方法。通常,当内部表大小乘以查询服务器的数量小于外部表大小时,也建议使用此分布方法。 |
|
||||
| PARTITION, NONE | 外部表的行使用以内部表的分区进行映射。内部表必须在联接键上进行分区。当外部表的分区数等于或几乎等于查询服务器数的倍数时,建议使用此分布方法。例如,有 14 个分区和 15 个查询服务器。 **注意** 如果内部表未分区或未在分区键上等分联接时,则优化器将忽略此 Hint。 |
|
||||
| NONE, PARTITION | 内部表的行使用外部表的分区进行映射。外部表必须在联接键上进行分区。当外部表的分区数等于或几乎等于查询服务器数的倍数时,建议使用此分布方法。例如,有 14 个分区和 15 个查询服务器。 **注意** 如果外部表未在分区键上进行分区或未等分联时接,则优化器将忽略此 Hint |
|
||||
| NONE, NONE | 每个查询服务器在一对匹配的分区之间执行联接操作,每个表中都有一个。两个表必须在连接键上等分。 |
|
||||
|
||||
|
||||
|
||||
例如,给定两个使用哈希联接来联接表 **r** 和 **s** ,以下查询包含使用哈希分配的 Hint:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list
|
||||
FROM r,s
|
||||
WHERE r.c=s.c;
|
||||
```
|
||||
|
||||
|
||||
|
||||
要广播外部表 **r** ,查询语句为:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list
|
||||
FROM r,s
|
||||
WHERE r.c=s.c;
|
||||
```
|
||||
|
||||
|
@ -1,194 +0,0 @@
|
||||
与查询策略相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
USE_JIT Hint
|
||||
------------------------
|
||||
|
||||
`USE_JIT` Hint 指示服务器在执行 SQL 语句时强制使用 JIT 模式编译执行表达式。
|
||||
|
||||
以下是 `USE_JIT` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_JIT */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_JIT*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_JIT Hint
|
||||
---------------------------
|
||||
|
||||
`NO_USE_JIT` Hint 指示服务器在执行 SQL 语句时避免使用 JIT 模式编译执行表达式。
|
||||
|
||||
以下是 `NO_USE_JIT` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_JIT*/
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+NO_USE_JIT*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_HASH_AGGREGATION Hint
|
||||
-------------------------------------
|
||||
|
||||
`USE_HASH_AGGREGATION` Hint 指示优化器在生成计划时强制使用 HASH 聚合算法运行该 SQL 语句。
|
||||
|
||||
以下是 `USE_HASH_AGGREGATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_HASH_AGGREGATION */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_HASH_AGGREGATION */ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_HASH_AGGREGATION Hint
|
||||
----------------------------------------
|
||||
|
||||
`NO_USE_HASH_AGGREGATION` Hint 指示优化器在执行 SQL 语句时避免使用 HASH 聚合算法运行该语句。
|
||||
|
||||
以下是 `NO_USE_HASH_AGGREGATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_HASH_AGGREGATION */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_HASH_AGGREGATION */ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_LATE_MATERIALIZATION Hint
|
||||
-----------------------------------------
|
||||
|
||||
`USE_LATE_MATERIALIZATION` Hint 指示优化器延迟物化视图。
|
||||
|
||||
以下是 `USE_LATE_MATERIALIZATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_LATE_MATERIALIZATION */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_LATE_MATERIALIZATION*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_LATE_MATERIALIZATION Hint
|
||||
--------------------------------------------
|
||||
|
||||
`NO_USE_LATE_MATERIALIZATION` Hint 指示优化器禁止延迟物化视图。
|
||||
|
||||
以下是 `NO_USE_LATE_MATERIALIZATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_LATE_MATERIALIZATION */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_LATE_MATERIALIZATION*/ e.department_id, sum(e.salary)
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
GROUP BY e.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_NL_MATERIALIZATION Hint
|
||||
---------------------------------------
|
||||
|
||||
`USE_NL_MATERIALIZATION` Hint 强制指示优化器指定表为内部表(子树)时生成一个物化算子来缓存数据。
|
||||
|
||||
以下是 `USE_NL_MATERIALIZATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_NL_MATERIALIZATION ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_NL_MATERIALIZATION(departments) */ *
|
||||
FROM employees, departments
|
||||
WHERE employees.department_id = departments.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_USE_NL_MATERIALIZATION Hint
|
||||
------------------------------------------
|
||||
|
||||
`NO_USE_NL_MATERIALIZATION` Hint 强制指示优化器在指定表为内部表(子树)时避免生成一个物化算子来缓存数据。
|
||||
|
||||
以下是 `NO_USE_NL_MATERIALIZATION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_USE_NL_MATERIALIZATION ( [ @ queryblock ] tablespec [ tablespec ]... ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_USE_NL_MATERIALIZATION(departments) */ *
|
||||
FROM employees, departments
|
||||
WHERE employees.department_id = departments.department_id;
|
||||
```
|
||||
|
||||
|
@ -1,262 +0,0 @@
|
||||
与查询转换相关的 Hint
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
NO_REWRITE Hint
|
||||
---------------------------
|
||||
|
||||
`NO_REWRITE` Hint 指示优化器为禁用查询去重写查询块,并覆盖了参数 `QUERY_REWRITE_ENABLED` 的设置。
|
||||
|
||||
以下是 `NO_REWRITE` 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_REWRITE [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_REWRITE */ sum(s.amount_sold) AS dollars
|
||||
FROM sales s, times t
|
||||
WHERE s.time_id = t.time_id
|
||||
GROUP BY t.calendar_month_desc;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_EXPAND Hint
|
||||
--------------------------
|
||||
|
||||
`NO_EXPAND` Hint 指示优化器不要对 `WHERE` 子句中具有 `OR` 条件或 `IN` 列表的查询考虑 `OR` 扩展。 通常,优化器会使用 `OR` 扩展,当确定使用 `OR` 扩展的成本低于不使用它时。
|
||||
|
||||
以下是 `NO_EXPAND` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_EXPAND [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_EXPAND */ *
|
||||
FROM employees e, departments d
|
||||
WHERE e.manager_id = 108
|
||||
OR d.department_id = 110;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_CONCAT Hint
|
||||
---------------------------
|
||||
|
||||
`USE_CONCAT` Hint 指示优化器使用 `UNION ALL` 运算符将查询 `WHERE`子句中的组合 `OR` 条件转换为复合查询。 如果没有这个 Hint,则仅当使用串联查询的成本低于比没有串联查询的成本时,才会发生此转换。`USE_CONCAT` Hint 将覆盖成本注意事项。
|
||||
|
||||
以下是 `USE_CONCAT` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_CONCAT [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_CONCAT */ *
|
||||
FROM employees e
|
||||
WHERE manager_id = 108
|
||||
OR department_id = 110;
|
||||
```
|
||||
|
||||
|
||||
|
||||
MERGE Hint
|
||||
----------------------
|
||||
|
||||
`MERGE` Hint 使您可以在查询中合并视图。
|
||||
|
||||
以下是 `MERGE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ MERGE [ ( @ queryblock ) | ( [ @ queryblock ] tablespec ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果视图的查询块在 `SELECT` 列表中包含 `GROUP BY` 子句或 `DISTINCT` 运算符时,只有启用了复杂的视图合并后,优化器才能将视图合并到正在访问的语句中。 如果子查询不相关,则也可以使用复杂合并将 `IN` 子查询合并到访问语句中。
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary
|
||||
FROM employees e1,
|
||||
(SELECT department_id, avg(salary) avg_salary
|
||||
FROM employees e2
|
||||
GROUP BY department_id) v
|
||||
WHERE e1.department_id = v.department_id
|
||||
AND e1.salary > v.avg_salary
|
||||
ORDER BY e1.last_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
当不带参数使用 `MERGE` Hint 时,应将其放在视图查询块中。 当视图名称作为参数使用
|
||||
|
||||
`MERGE` Hint 时,应将其放在周边查询中。
|
||||
|
||||
NO_MERGE Hint
|
||||
-------------------------
|
||||
|
||||
`NO_MERGE` Hint 指示优化器不要将外部查询和任何内联视图查询合并到单个查询中。
|
||||
|
||||
以下是 `NO_MERGE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_MERGE [ ( @ queryblock ) | ( [ @ queryblock ] tablespec ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
此 Hint 会影响您访问视图的方式。 例如,以下语句导致视图 **seattle_dept** 不被合并:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ NO_MERGE(seattle_dept) */ e1.last_name, seattle_dept.department_name
|
||||
FROM employees e1,
|
||||
(SELECT location_id, department_id, department_name
|
||||
FROM departments
|
||||
WHERE location_id = 1700) seattle_dept
|
||||
WHERE e1.department_id = seattle_dept.department_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
在视图查询块中使用 `NO_MERGE` Hint 时,不需要为它指定参数。 在周围的查询中使用 `NO_MERGE` Hint 时,需要将视图名称指定为它的参数。
|
||||
|
||||
UNNEST Hint
|
||||
-----------------------
|
||||
|
||||
`UNNEST` Hint 指示优化器不要嵌套而是并将子查询的主体合并到包含该 Hint 的查询块的主体中,从而使优化器在评估访问路径和联接时将它们一起考虑在内。
|
||||
|
||||
以下是 `UNNEST` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ UNNEST [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
在取消嵌套子查询之前,优化器首先验证子查询是否有效,并且必须通过探索和查询优化测试。 使用 `UNNEST` Hint 时优化器仅检查子查询块的有效性。 如果子查询块有效,那么将直接取消嵌套子查询,而无需通过探索和查询优化测试。
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT AVG(t1.c) FROM t1
|
||||
WHERE t1.b >=
|
||||
(SELECT /*+unnest*/AVG(t2.b)
|
||||
FROM t2
|
||||
WHERE t1.a = t2.a);
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_UNNEST Hint
|
||||
--------------------------
|
||||
|
||||
`NO_UNNEST` Hint 用来关闭取消嵌套的操作。
|
||||
|
||||
以下是 `NO_UNNEST` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_UNNEST [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+no_unnest(@qb1)*/AVG(t1.c)
|
||||
FROM t1 WHERE t1.b >=
|
||||
(SELECT /*+qb_name(qb1)*/AVG(t2.b)
|
||||
FROM t2)
|
||||
WHERE t1.a = t2.a);
|
||||
```
|
||||
|
||||
|
||||
|
||||
PLACE_GROUP_BY Hint
|
||||
-------------------------------
|
||||
|
||||
`PLACE_GROUP_BY` Hint指示优化器采用 GROUP BY 位置替换规则,此时优化器不考虑转换之后的代价增大。
|
||||
|
||||
以下是`PLACE_GROUP_BY` Hint的语法:
|
||||
|
||||
```javascript
|
||||
/*+ PLACE_GROUP_BY [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+place_group_by*/SUM(t1.c),SUM(t2.c) FROM t1, t2
|
||||
WHERE t1.a = t2.a AND t1.b > 10 AND t2.b > 10
|
||||
GROUP BY t1.a;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_PLACE_GROUP_BY Hint
|
||||
----------------------------------
|
||||
|
||||
`NO_PLACE_GROUP_BY` Hint 用来关闭 GROUP BY 位置替换转换。
|
||||
|
||||
以下是`NO_PLACE_GROUP_BY` Hint的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_PLACE_GROUP_BY [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+no_place_group_by*/SUM(t1.c),SUM(t2.c) FROM t1, t2
|
||||
WHERE t1.a = t2.a AND t1.b > 10 AND t2.b > 10
|
||||
GROUP BY t1.a;
|
||||
```
|
||||
|
||||
|
||||
|
||||
NO_PRED_DEDUCE Hint
|
||||
-------------------------------
|
||||
|
||||
`NO_PRED_DEDUCE` Hint 用来指示优化器不是用谓词推导转换规则。
|
||||
|
||||
以下是`NO_PRED_DEDUCE` Hint的语法:
|
||||
|
||||
```javascript
|
||||
/*+ NO_PRED_DEDUCE [ ( @ queryblock ) ] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+no_pred_deduce(@qb1)*/ *
|
||||
FROM (
|
||||
SELECT /*+no_merge qb_name(qb1)*/ t1.a, t2.b
|
||||
FROM t1, t2
|
||||
WHERE t1.a = t2.a) v, t3
|
||||
WHERE t3.a = 1 AND t3.a = v.a;
|
||||
```
|
||||
|
||||
|
@ -1,261 +0,0 @@
|
||||
其他 Hint
|
||||
============================
|
||||
|
||||
|
||||
|
||||
QB_NAME Hint
|
||||
------------------------
|
||||
|
||||
使用 `QB_NAME` Hint 来定义查询块的名称。然后,可以在外部查询的 Hint 中使用这个名称,也可以在内联视图的 Hint 中使用这个名称,从而影响查询在被命名查询块中的表上的执行。更多关于查询块名称的信息,请参阅文档 [Hint 概述](../../../../../11.sql-reference-oracle-mode/3.basic-elements-1/6.annotation-1/4.Hint/1.hint-overview.md) 中的在 Hint 中定义查询块。
|
||||
|
||||
以下是 `QB_NAME` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ QB_NAME ( queryblock ) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果两个或多个查询块具有相同的名称,或者同一个查询块两次被 Hint 指定了不同的名称,那么优化器将忽略所有引用该查询块的名称和 Hint。未使用 `QB_NAME` Hint 命名的查询块具有由系统生成的惟一名称。这些名称可以显示在计划表中,也可以在查询块中的其他 Hint 中使用。
|
||||
|
||||
以下是 `QB_NAME` Hint 的示例:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name
|
||||
FROM employees e
|
||||
WHERE last_name = 'Smith';
|
||||
```
|
||||
|
||||
|
||||
|
||||
READ_CONSISTENCY Hint
|
||||
---------------------------------
|
||||
|
||||
`READ_CONSISTENCY` Hint 指示服务器去指定某条 SQL 所读取的表模式为弱一致(指定参数
|
||||
|
||||
`WEAK`)或强一致性(指定参数 `STRONG`)。
|
||||
|
||||
以下是 `READ_CONSISTENCY` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ READ_CONSISTENCY(WEAK[STRONG]) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ READ_CONSISTENCY(WEAK) */ *
|
||||
FROM employees
|
||||
WHERE employees.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
FROZEN_VERSION Hint
|
||||
-------------------------------
|
||||
|
||||
`FROZEN_VERSION` Hint 指示服务器读取某个基线数据的版本。
|
||||
|
||||
以下是 `FROZEN_VERSION` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ FROZEN_VERSION (intnum) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ FROZEN_VERSION(1000) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
QUERY_TIMEOUT Hint
|
||||
------------------------------
|
||||
|
||||
`QUERY_TIMEOUT` Hint 指示服务器设定某条 SQL 执行时的超时时间,单位为微妙。
|
||||
|
||||
以下是 `QUERY_TIMEOUT` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ QUERY_TIMEOUT (intnum) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下,当该查询 1 秒之内未执行完该语句即返回超时错误:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ QUERY_TIMEOUT(1000000) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
LOG_LEVEL Hint
|
||||
--------------------------
|
||||
|
||||
`LOG_LEVEL` Hint 指示服务器运行某句 SQL 时采用何种日志级别来执行。
|
||||
|
||||
以下是 `LOG_LEVEL` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ LOG_LEVEL ([']log_level[']) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下示例采用 `DEBUG` 日志级别来执行该 SQL 语句:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ LOG_LEVEL(DEBUG) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
USE_PLAN_CACHE Hint
|
||||
-------------------------------
|
||||
|
||||
`USE_PLAN_CACHE` Hint 指示服务器执行某条 SQL 时是否要在计划缓存机制下运行,参数 `NONE` 为不执行计划缓存机制,参数 `DEFAULT` 表示按照服务器本身的设置来决定是否执行计划缓存机制。
|
||||
|
||||
以下是 `USE_PLAN_CACHE` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ USE_PLAN_CACHE (NONE[DEFAULT]) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下,以下语句不执行计划缓存机制:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ USE_PLAN_CACHE(NONE) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
TRANS_PARAM Hint
|
||||
----------------------------
|
||||
|
||||
`TRANS_PARAM` Hint 指示服务器执行事务时是否要按照参数 `param` 指定的参数来执行,现在支持的参数只有事务层面的提前解行锁 `FORCE_EARLY_LOCK_FREE` 参数,`FORCE_EARLY_LOCK_FREE` 的值为 **TRUE** 时表示支持, **FALSE** 表示不支持。注意这里的参数名和参数值要用单引号(' ')引起来,当参数的值为数值型时可以不用引号引起来。
|
||||
|
||||
以下是 `TRANS_PARAM` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ TRANS_PARAM ['param' , 'param_value'] */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ TRANS_PARAM('FORCE_EARLY_LOCK_FREE' 'TRUE') */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
TRACING Hint
|
||||
------------------------
|
||||
|
||||
`TRACING` Hint 指示服务器对某些执行计划中的算子采用 `TRACING` 跟踪。
|
||||
|
||||
以下是 `TRACING` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ TRACING(TRACING_NUM_LIST)*/
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ TRACING(1) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
STAT Hint
|
||||
---------------------
|
||||
|
||||
`STAT` Hint 指示对某些执行计划中的算子采用 `STAT` 显示信息。
|
||||
|
||||
以下是 `STAT` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ STAT(TRACING_NUM_LIST) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ STAT(1) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
TOPK Hint
|
||||
---------------------
|
||||
|
||||
`TOPK` Hint 指示服务器设置模糊查询的精度和最小行数。其中参数 `PRECSION` 的值为整型,取值范围为 0\~100,表示执行模糊查询时的行数百分比,参数 `MINIMUM_ROWS` 用来指定最小的返回行数。
|
||||
|
||||
以下是 `TOPK` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ TOPK(PRECISION MINIMUM_ROWS) */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ TOPK(1,10) */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
||||
|
||||
TRACE_LOG Hint
|
||||
--------------------------
|
||||
|
||||
`TRACE_LOG` Hint 指示服务器收集跟踪日志(Trace log),收集的跟踪日志(Trace log)在运行 `SHOW TRACE` 命令时展示。
|
||||
|
||||
以下是 `TRACE_LOG` Hint 的语法:
|
||||
|
||||
```javascript
|
||||
/*+ TRACE_LOG */
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例如下:
|
||||
|
||||
```javascript
|
||||
SELECT /*+ TRACE_LOG */ *
|
||||
FROM employees e
|
||||
WHERE e.department_id = 1001;
|
||||
```
|
||||
|
||||
|
@ -1,22 +0,0 @@
|
||||
Schema 对象
|
||||
=========
|
||||
|
||||
Schema 是数据的逻辑结构和 Schema 对象的集合。每个 OceanBase 数据库的使用者都拥有一个 Schema,并且Schema 拥有和使用者相同的名字。
|
||||
|
||||
可以使用 SQL 来创建和处理用户数据库对象,并且 Schema 对象有以下类型:
|
||||
|
||||
* 约束 Constraints
|
||||
* 数据库链接 Database links
|
||||
* 数据库触发器 Database triggers
|
||||
* 索引 Indexes
|
||||
* 对象表 Object tables
|
||||
* 对象类型 Object types
|
||||
* 对象视图 Object views
|
||||
* 包 Packages
|
||||
* 序列 Sequences
|
||||
* 存储函数 Stored functions
|
||||
* 存储过程 Stored procedures
|
||||
* 同义词 Synonyms
|
||||
* 表 Tables
|
||||
* 视图 Views
|
||||
|
@ -1,12 +0,0 @@
|
||||
数据库对象命名规范概述
|
||||
================================
|
||||
|
||||
|
||||
|
||||
一些数据库对象由用户可以命名的部分和用户必须命名的部分组成。例如,表或视图中的列,索引、表分区和表的子分区,表的完整性约束以及存储在包中的对象(包括程序和存储函数)。本章将讨论:
|
||||
|
||||
• 数据库对象命名规则
|
||||
|
||||
• Schema 对象命名示例
|
||||
|
||||
• Schema 对象命名准则
|
@ -1,117 +0,0 @@
|
||||
数据库对象命名规则
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
数据库对象标识符
|
||||
--------------------
|
||||
|
||||
每个数据库对象都有名字。在 SQL 语句中您可以使用引用标识符和非引用标识符来命名任何数据库对象:
|
||||
|
||||
* 引用标识符:以双引号 `" "` 为开头和结尾的标识符。如果使用引用标识符命名 Schema 对象,则在引用该对象时必须使用双引号。
|
||||
|
||||
|
||||
|
||||
* 非引用标识符:标识符中不包含任何标点符号。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
但是,数据库名称、全局数据库名称、数据库链接名称、磁盘组名称和可插入数据库(PDB)始终不区分大小写,并以大写形式存储。如果使用引用标识符为它们命名,那么引号将被忽略。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
OceanBase 并不建议您使用引用标识符来命名数据库对象。这些引用标识符在 SQL PLUS 中兼容,但是在其他数据库对象管理工具中可能不被识别。
|
||||
|
||||
标识符使用规则
|
||||
-------------------
|
||||
|
||||
以下是一些适用于引用标识符和非引用标识符的规则,除非另有说明,否则以下规则对引用标识符和非引用标识符同时适用。
|
||||
|
||||
### 标识符的长度
|
||||
|
||||
标识符的长度为 1\~128 字节。
|
||||
|
||||
如果标识符包含由句点分隔的多个部分,则每个部分最长都可达 128 字节。每个句点分隔符以及旁边的引号都算作一个字节。例如以下字符串:
|
||||
|
||||
```javascript
|
||||
"schema"."table"."column"
|
||||
```
|
||||
|
||||
|
||||
|
||||
示例名称中的三部分 **schema** 、 **table** 和 **column** 各自最长可以是 128 字节,每个引号和句点都是单字节字符,所以示例中标识符的总长度为 392 字节。
|
||||
|
||||
### 保留字做标识符
|
||||
|
||||
非引用标识符不能是 OceanBase SQL 保留字。引用标识符可以是保留字,但不建议这样做。根据您计划用于访问数据库对象的工具不同,名称可能进一步受到其他产品特定的保留字限制。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
保留字 `ROWID` 是这个规则的一个例外。不能使用大写单词 `ROWID` 作为列的名称,无论是带引号的还是不带引号的。但是,引用标识符作为列名时,不可以使用全大写单词,但是可以包含一个或多个小写字母(例如,"Rowid"或"Rowid")。
|
||||
|
||||
### 特殊含义单词做标识符
|
||||
|
||||
OceanBase 中的 SQL 语言包含了其他具有特殊含义的单词。这些词包括数据类型、Schema 名、函数名、虚拟系统表 `DUAL` 和关键字(SQL 语句中的大写单词,如 `DIMENSION`、`SEGMENT`、`ALLOCATE`、`DISABLE` 等)。这些词不是保留字,但是,OceanBase 在内部以特定的方式使用它们。因此,如果您使用这些词作为对象和对象部件的名称,SQL 语句可能会难以阅读,并可能导致不可预测的结果。尤其是不要使用 SQL 内置函数的名称作为 Schema 对象和用户自定义函数的名称。
|
||||
|
||||
### ASCII 字符做标识符
|
||||
|
||||
在数据库名称、全局数据库名称和数据库链接名称中您应该使用 ASCII 字符集中的字符,因为这些字符拥有跨不同平台和操作系统的最佳兼容性。多租户容器数据库(CDB)中的通用用户和通用角色的名称只能使用 ASCII 字符集中的字符。
|
||||
|
||||
### 密码中的字符
|
||||
|
||||
密码中可以包含多位字节的字符,如汉字或中文标点等。
|
||||
|
||||
### 标识符的开头
|
||||
|
||||
非引用标识符必须以数据库字符集中的字母字符开头。引用标识符可以以任何字符开头。
|
||||
|
||||
### 标识符中的符号
|
||||
|
||||
非引用标识符只能包含来自数据库字符集的字母数字字符和下划线(_)。但是用于数据库链接名称时可以包含句点(.)和符号 @。引用标识符可以包含任何字符、标点符号和空格。但是,引用标识符和非引用标识符都不能包含双引号或空字符(\\0)。
|
||||
|
||||
### 对象名称在名称空间中的限制
|
||||
|
||||
在同一个名称空间中,表、视图、私有同义词不能拥有相同的名称。
|
||||
|
||||
### 标识符的大小写
|
||||
|
||||
非引用标识符不区分大小写,OceanBase 将他们存储为大写。引用标识符区分大小写,所以通过将名称括在双引号里,在同一命名空间的不同对象可以拥有以下类型的名称:
|
||||
|
||||
```javascript
|
||||
"employees"
|
||||
"Employees"
|
||||
"EMPLOYEES"
|
||||
```
|
||||
|
||||
|
||||
|
||||
由于非引用标识符不区分大小写,所以 OceanBase 认为以下名称是相同的,他们不能作为同一名称空间下不同对象的名字:
|
||||
|
||||
```javascript
|
||||
employees
|
||||
EMPLOYEES
|
||||
"EMPLOYEES"
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 大写标识符
|
||||
|
||||
存储或比较大写的标识符时,每个字符的大写形式是通过应用数据库字符集的大写规则来确定的。由对话设置 `NLS_SORT` 所设定的特定语言规则不在考虑的范围内。此行为是将 SQL 函数 `UPPER` 应用于标识符,而不是将函数 `NLS_UPPER` 应用于标识符。
|
||||
|
||||
数据库字符集的大写规则被应用到自然语言时可能产生不正确的结果。例如,德国小写字母 `ß`,它在数据库字符集大写规则中并没有对应的大写形式, 所以当含有它的标识符被转换为大写形式时它并不会被转变。
|
||||
|
||||
数据库字符集大写规则确保标识符在任何语言配置的会话中的样式是相同的。如果希望标识符在某种自然语言中看起来正确,那么可以通过引号来保留它的小写形式,或者在使用该标识符时使用对应语言上正确的大写形式。
|
||||
|
||||
### 列的名称
|
||||
|
||||
同一表或视图中的列不能具有相同的名称。但是,不同表或视图中的列可以具有相同的名称。
|
||||
|
||||
### 程序和函数的名称
|
||||
|
||||
如果同一包中的程序或函数所包含的参数的数量和数据类型不同,则它们可以具有相同的名称。在同一个包中使用不同的参数创建具有相同名称的多个过程或函数称为重载过程或函数。
|
@ -1,21 +0,0 @@
|
||||
Schema 对象命名示例
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
以下是一些有效的 Schema 对象命名示例:
|
||||
|
||||
* `last_name`
|
||||
|
||||
* `horse`
|
||||
|
||||
* `hr.hire_date`
|
||||
|
||||
* `"EVEN THIS & THAT!"`
|
||||
|
||||
* `a_very_long_and_valid_name`
|
||||
|
||||
|
||||
|
||||
|
||||
这些示例都遵循了 [数据库对象命名规则](../../../11.sql-reference-oracle-mode/3.basic-elements-1/8.database-naming-convention/2.database-object-naming-rules.md) 中列出的规则。
|
@ -1,27 +0,0 @@
|
||||
Schema 对象命名准则
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
以下是一些有用的用来命名对象及其部分的准则:
|
||||
|
||||
* 使用完整的、描述性的、可发音的名称或众所周知的缩写。
|
||||
|
||||
|
||||
|
||||
* 使用一致的命名规则。
|
||||
|
||||
|
||||
|
||||
* 使用相同的名称来描述跨表的相同实体或属性。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
在命名对象时,要在简单易用和名称具有描述性的目标之间取得平衡。如果无法平衡,请选择更具描述性的名称,因为数据库中的对象可能会在很长一段时间内被使用,从现在开始十年后的用户可能难以理解名称为 **pmdd** 的表列是用来存储什么信息的,但是 **payment_due_date** 却更清楚明了。
|
||||
|
||||
使用一致的命名规则可以帮助用户理解每个表在应用程序中扮演的角色。例如,以 **fin_** 为开头命名所有属于 **FINANCE** 应用程序的表的名称。
|
||||
|
||||
使用相同的名称描述表中的相同内容。例如,雇员和部门表的部门号列其实存储的是一样的值,那么在雇员表和部门表中这一列均被命名为 **department_id** 。
|
@ -1,21 +0,0 @@
|
||||
数据库对象引用概述
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
本章将讨论如何在 SQL 语句的上下文中引用 Schema 对象。本章包括:
|
||||
|
||||
* 引用 Schema 对象
|
||||
|
||||
|
||||
|
||||
* 引用分区表和索引
|
||||
|
||||
|
||||
|
||||
* 引用对象类型属性和方法
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,81 +0,0 @@
|
||||
引用 Schema 对象
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
当在 SQL 语句中引用对象时,OceanBase 会考虑 SQL 语句的上下文并在适当的名称空间中找到该对象。找到对象后,OceanBase 执行 SQL 语句对该对象指定的操作。如果在适当的名称空间中找不到命名的对象,则返回错误。
|
||||
|
||||
引用用户的 Schema 中的对象
|
||||
-----------------------------
|
||||
|
||||
以下示例说明了 OceanBase 如何解析 SQL 语句中对象的引用。
|
||||
|
||||
执行以下语句,向名为 **departments** 的表中添加了一行数据:
|
||||
|
||||
```javascript
|
||||
INSERT INTO departments
|
||||
VALUES (280, 'ENTERTAINMENT_CLERK', 206, 1700);
|
||||
```
|
||||
|
||||
|
||||
|
||||
根据 SQL 语句的上下文, **departments** 在数据库中可能是:
|
||||
|
||||
* 一张在您自己 Schema 中的表
|
||||
|
||||
|
||||
|
||||
* 一个在您自己 Schema 中的视图
|
||||
|
||||
|
||||
|
||||
* 一个表或视图的专有同义词
|
||||
|
||||
|
||||
|
||||
* 一个公共同义词
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OceanBase 始终会先尝试在您自己的 Schema 中的名称空间里解析被引用对象,然后再考虑该 Schema 之外的名称空间。在此示例中,OceanBase 尝试解析如下:
|
||||
|
||||
1. 首先,OceanBase 尝试在您自己的包含了表、视图和专用同义词的 Schema 中的名称空间里去定位对象。如果对象是专用同义词,则 OceanBase 会找到该同义词所代表的对象。该对象可以在您自己的 Schema 中,也可以在其他 Schema 中或者在另一个数据库中。该对象也可以是其他的同义词,在这种情况下,OceanBase 会找到同义词所代表的对象。
|
||||
|
||||
|
||||
|
||||
2. 如果对象在名称空间中被找到,则 OceanBase 尝试对该对象执行 SQL 语句。在此示例中,OceanBase 尝试将一行数据添加到 **departments** 中。如果此对象的类型不是该 SQL 语句所需要的类型,则 OceanBase 返回错误。在此示例中, **departments** 必须是表、视图或者可以是可以解析为表或视图的专用同义词。如果 **departments** 是序列,则 OceanBase 返回错误。
|
||||
|
||||
|
||||
|
||||
3. 如果该对象到目前为止没有在任何名称空间中被搜索到,则 OceanBase 将搜索包含公共同义词的名称空间。如果对象在包含公共同义词的名称空间中,则 OceanBase 尝试对该对象执行该语句。如果此对象的类型不是该 SQL 语句所需要的类型,则 OceanBase 返回错误,例如在此示例中,如果 **departments** 是一个代表了序列的公共同义词,那么 OceanBase 将返回错误。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
如果公共同义词包含任何依赖表或用户定义类型,则不能在与依赖对象相同的 Schema 中创建与同义词同名的对象。
|
||||
|
||||
反之,如果同义词没有任何依赖表或用户定义的类型,则可以在与依赖对象相同的 Schema 中创建具有相同名称的对象。OceanBase 会使所有依赖对象无效,并在下一次访问它们时重新验证它们。
|
||||
|
||||
引用其他 Schema 中的对象
|
||||
----------------------------
|
||||
|
||||
要引用您的 Schema 之外的 Schema 中的对象,需要在对象名称前添加 Schema 名称:
|
||||
|
||||
```javascript
|
||||
schema.object
|
||||
```
|
||||
|
||||
|
||||
|
||||
例如,以下示例展示了在名为 **hr** 的 Schema 中删除表 **employees** :
|
||||
|
||||
```javascript
|
||||
DROP TABLE hr.employees;
|
||||
```
|
||||
|
||||
|
@ -1,66 +0,0 @@
|
||||
创建数据库链接
|
||||
============================
|
||||
|
||||
|
||||
|
||||
要引用除本地数据库以外的其他数据库中的对象,需要在对象名称后加上指向该数据库的数据库链接的名称。数据库链接是一个 Schema 对象,它使 OceanBase 连接到远程数据库以访问里面的对象。
|
||||
|
||||
可以使用语句 CREATE DATABASE LINK 创建数据库链接,使用该语句时需要指定以下数据库链接的信息:
|
||||
|
||||
* 租户名、用户名和密码。
|
||||
|
||||
|
||||
|
||||
* 网络地址、端口号。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OceanBase 将上述信息存储在数据字典中。
|
||||
|
||||
创建链接限制
|
||||
------------------
|
||||
|
||||
1. 只支持创建 OceanBase 中的 Oracle 模式租户连接到另一个 Oracle 模式租户的数据库链接,OceanBase 目前不支持创建连接到外部 Oracle 数据库的数据库链接。
|
||||
|
||||
|
||||
|
||||
2. 一个租户可以反复创建、删除数据库链接,但最多只能同时存在 15 个数据库链接。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
数据库连接串格式
|
||||
--------------------
|
||||
|
||||
```javascript
|
||||
user_name@tenant_name IDENTIFIED BY password HOST 'ip:port'
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **user_name** :用户名。
|
||||
|
||||
* **tenant_name** :租户名。
|
||||
|
||||
* **password** :密码。
|
||||
|
||||
* **ip** :网络地址。
|
||||
|
||||
* **port** :端口号。
|
||||
|
||||
|
||||
|
||||
|
||||
以下是创建数据库链接的示例:
|
||||
|
||||
```javascript
|
||||
CREATE DATABASE LINK my_link CONNECT TO
|
||||
root@oracle IDENTIFIED BY abcdef HOST '192.168.0.0:1521';
|
||||
```
|
||||
|
||||
|
@ -1,29 +0,0 @@
|
||||
引用数据库链接
|
||||
============================
|
||||
|
||||
|
||||
|
||||
当您发出包含数据库链接的 SQL 语句时,需要使用存储在数据字典中的完整数据库链接名,更多关于数据库链接名称的信息请查看文档 [创建数据库链接](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/9.database-object-reference-method/3.reference-objects-in-a-remote-database/1.create-database-link.md)。
|
||||
|
||||
OceanBase 在连接远程数据库时,将使用数据库连接字符串访问远程数据库。使用数据库字符串、用户名和密码后连接成功,则 OceanBase 使用文档 [引用 Schema 对象](../../../../11.sql-reference-oracle-mode/3.basic-elements-1/9.database-object-reference-method/2.reference-a-schema-object.md) 中的规则来访问远程数据库上的指定对象,但请注意相关限制:
|
||||
|
||||
1. 只能执行只读语句。
|
||||
|
||||
|
||||
|
||||
2. 只能访问表对象,不支持访问其它对象,如视图、序列等。
|
||||
|
||||
|
||||
|
||||
3. 访问表对象时必须显式指定数据库名,如:`test.t1@my_link`。
|
||||
|
||||
|
||||
|
||||
4. 不支持部分计划和算子:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,79 +0,0 @@
|
||||
引用分区表和索引
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
表和索引可以分区。进行分区时,这些 Schema 对象由许多称为分区的部分组成,所有这些部分都具有相同的逻辑属性。例如,表中的所有分区共享相同的列和约束定义,而索引中的所有分区共享相同的索引列。
|
||||
|
||||
分区扩展名和子分区扩展名使用户可以执行某些分区级和子分区级操作,例如,仅在一个分区或子分区上删除其中的所有行。没有扩展名称时,此类操作将要求您使用判断语句定义范围(`WHERE` 子句)。对于范围分区表和列表分区表,尝试用判断语句描述分区级操作可能会很麻烦,尤其是当范围分区键使用多个列时。对于哈希分区和子分区,使用判断语句更加困难,因为这些分区和子分区是基于系统定义的哈希函数。
|
||||
|
||||
分区扩展名使您可以像使用表一样使用分区。此方法的一个优点(对范围分区的表最有用)是,您可以通过对其他用户或角色授予(或撤消)这些视图的特权来构建分区级别的访问控制机制。要将分区用作表,需要通过从单个分区中选择数据来创建视图,然后将该视图用作表。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
当在 SQL 语句的语法或轨道图中出现 `partition_extended_name` 或者 `subpartition_extended_name` 元素时,用户可以通过这两个元素指定分区扩展表名和子分区扩展表名。`partition_extended_name` 的语法:
|
||||
|
||||
```javascript
|
||||
PARTITION partition
|
||||
|
|
||||
PARTITION FOR ( partition_key_value [, partition_key_value]... )
|
||||
```
|
||||
|
||||
|
||||
|
||||
`subpartition_extended_name` 的语法:
|
||||
|
||||
```javascript
|
||||
SUBPARTITION subpartition
|
||||
|
|
||||
SUBPARTITION FOR ( subpartition_key_value [, subpartition_key_value]... )
|
||||
```
|
||||
|
||||
|
||||
|
||||
DML 语句 `INSERT`、`UPDATE` 、 `DELETE` 和 `ANALYZE` 语句需要在分区或子分区名称的周围加上括号。这个小的区别体现在 `partition_extension_clause` 元素中。在 `partition_extended_name`,`subpartition_extended_name` 和 `partition_ extension_clause` 中,可以使用 `PARTITION FOR` 和 `SUBPARTITION FOR` 子句在不使用名称的情况下引用分区。它们对任何类型的分区均有效,尤其是间隔分区。将数据插入表中时,间隔分区会根据需要被自动创建。
|
||||
|
||||
对于上述元素中各自的 `partition_key_value` 或 `subpartition_key_value` 部分,它们为每个分区键列指定一个值。对于多列分区键,需要为每个分区键指定一个值。对于复合分区,对每个分区键指定一个值后,需要继续为每个子分区键指定一个值。所有分区键值均以逗号分隔。对于间隔分区,您只能指定一个 `partition_key_value`,并且它必须是有效的 `NUMBER` 数据类型或日期时间数据类型的值。用户的 SQL 语句将在包含用户指定了值的分区或子分区上运行。
|
||||
|
||||
扩展名称的限制
|
||||
-------------------
|
||||
|
||||
使用分区扩展表名和子分区扩展表名时有以下限制:
|
||||
|
||||
* 名称中没有远程表:扩展分区表名和子分区扩展表名不能包含数据库链接或能转换为具有数据库链接的表的同义词。要使用远程分区和远程子分区,需要在远程站点上使用扩展表名语法创建一个视图,然后引用该远程视图。
|
||||
|
||||
|
||||
|
||||
* 名称中没有同义词:必须使用基表指定分区或子分区扩展名,不能使用同义词,视图或任何其他对象。
|
||||
|
||||
|
||||
|
||||
* 在 `PARTITION FOR` 和 `SUBPARTITION FOR` 子句中,不能指定关键字 `DEFAULT` 、`MAXVALUE` 或绑定变量为 `partition_key_value` 或 `subpartition_key_value` 的值。
|
||||
|
||||
|
||||
|
||||
* 在 `PARTITION` 和 `SUBPARTITION` 子句中,不能为分区或子分区名称指定绑定变量。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
在以下示例中, **sales** 是具有分区 **sales_q1_2000** 的分区表。以下语句创建了单个分区 **sales_q1_2000** 的视图,然后像使用表一样使用它。本示例从分区中删除了一些行:
|
||||
|
||||
```javascript
|
||||
/*为分区 sales_q1_2000 创建视图 Q1_2000_sales*/
|
||||
CREATE VIEW Q1_2000_sales
|
||||
AS
|
||||
SELECT *
|
||||
FROM sales PARTITION (SALES_Q1_2000);
|
||||
/*删除视图 Q1_2000_sales 中符合条件 amount_sold < 0 的值*/
|
||||
DELETE FROM Q1_2000_sales
|
||||
WHERE amount_sold < 0;
|
||||
```
|
||||
|
||||
|
@ -1,62 +0,0 @@
|
||||
引用对象类型的属性和方法
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
要在 SQL 语句中引用对象类型属性或方法,必须使用表别名完全限定该引用。以下示例中样本 Schema **ob** 包含类 **cust_address_typ** 和表 **customers** , **customers** 拥有一个 **cust_address_typ** 类型的列 **cust_address** :
|
||||
|
||||
```javascript
|
||||
CREATE TYPE cust_address_typ
|
||||
OID '82A4AF6A4CD1656DE034080020E0EE3D'
|
||||
AS OBJECT
|
||||
(street_address VARCHAR2(40),
|
||||
postal_code VARCHAR2(10),
|
||||
city VARCHAR2(30),
|
||||
state_province VARCHAR2(10),
|
||||
country_id CHAR(2));
|
||||
/
|
||||
CREATE TABLE customers
|
||||
(customer_id NUMBER(6),
|
||||
cust_first_name VARCHAR2(20) CONSTRAINT cust_fname_nn NOT NULL,
|
||||
cust_last_name VARCHAR2(20) CONSTRAINT cust_lname_nn NOT NULL,
|
||||
cust_address cust_address_typ,
|
||||
. . .
|
||||
```
|
||||
|
||||
|
||||
|
||||
在 SQL 语句中,对 **postal_code** 属性的引用必须使用表别名进行完全限定,如下所示:
|
||||
|
||||
```javascript
|
||||
SELECT c.cust_address.postal_code
|
||||
FROM customers c;
|
||||
|
||||
UPDATE customers c
|
||||
SET c.cust_address.postal_code = '610000'
|
||||
WHERE c.cust_address.city = 'chengdu'
|
||||
AND c.cust_address.state_province = 'SICHUAN';
|
||||
```
|
||||
|
||||
|
||||
|
||||
要引用不接受参数的成员方法,必须提供空括号。例如,样本 Schema **ob** 包含一个基于 **catalog_typ** 的对象表 **category_tab** ,该表包含成员函数 `getCatalogName`。为了在 SQL 语句中调用此方法,必须提供空括号,如下所示:
|
||||
|
||||
```javascript
|
||||
SELECT TREAT(VALUE(c) AS catalog_typ).getCatalogName() "Catalog Type"
|
||||
FROM categories_tab c
|
||||
WHERE category_id = 10;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+----------------+
|
||||
| Catalog Type |
|
||||
+----------------+
|
||||
| online catalog |
|
||||
+----------------+
|
||||
```
|
||||
|
||||
|
@ -1,89 +0,0 @@
|
||||
运算符概述
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
运算符一般用于连接运算数或参数之类的单个数据项且返回结果。从语法上讲,运算符出现在运算数之前、之后或两个运算数之间均可。一般用特殊字符或关键字表示运算符,例如,除法运算符用斜杠(/)表示。本章讨论非逻辑(非布尔)运算符,这些运算符本身不能用作查询或子查询的 `WHERE` 或 `HAVING` 条件。
|
||||
|
||||
本章将详细介绍以下运算符:
|
||||
|
||||
* 算术运算符
|
||||
|
||||
|
||||
|
||||
* 串联运算符
|
||||
|
||||
|
||||
|
||||
* 层次查询运算符
|
||||
|
||||
|
||||
|
||||
* 集合运算符
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
一元和二元运算符
|
||||
--------------------
|
||||
|
||||
运算符可分为两大类:
|
||||
|
||||
* 一元运算符:一元运算符仅对一个运算数进行运算。一元运算符常用格式:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
运算符 运算数
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 二元运算符:二元运算符顾名思义是对两个运算数进行运算。二元运算符常用格式:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
运算数1 运算符 运算数2
|
||||
```
|
||||
|
||||
|
||||
|
||||
其他具有特殊格式的运算符可接受两个以上的运算数。如果为运算符提供了空运算数(NULL), 则结果始终为空。唯一不遵循此规则的是串联(\|\|)运算符。
|
||||
|
||||
运算符优先级
|
||||
------------------
|
||||
|
||||
优先级会影响 OceanBase 数据库在同一表达式中计算不同运算符的顺序。在计算包含多个运算符的表达式时,OceanBase 会先计算优先级更高的运算符,然后再计算优先级较低的运算符,优先级相等时,在表达式中从左到右对相等的运算符求值。
|
||||
|
||||
下表列出了 SQL 运算符中从高到低的优先级。同一行上列出的运算符具有相同的优先级。
|
||||
|
||||
|
||||
| 运算符 | 运算方式 |
|
||||
|------------------------------------|------------------------------------------------------------------|
|
||||
| +、-(作为一元运算符)、PRIOR、CONNECT_BY_ROOT | 正号、负号、层次结构中的位置。 |
|
||||
| \*、/ | 乘法、除法。 |
|
||||
| +、-(作为二元运算符)、\|\| | 加、减、串联。 |
|
||||
| 条件表达式在数据库评估完运算符后再进行评估 | 详情请参阅文档 [SQL 条件概述](../../11.sql-reference-oracle-mode/7.condition/1.overview-of-sql-conditions.md)。 |
|
||||
|
||||
|
||||
|
||||
在以下示例中,由于乘法的优先级高于加法,因此数据库首先将 2 乘以 3,然后再将结果加到 1。
|
||||
|
||||
```javascript
|
||||
1+2*3
|
||||
```
|
||||
|
||||
|
||||
|
||||
您也可以在表达式中使用括号来限制运算符优先级。OceanBase 数据库将先对括号内的表达式求值,再对括号外部的表达式求值。
|
||||
|
||||
SQL 还支持集合运算符(`UNION`、`UNION ALL`、`INTERSECT` 和 `MINUS`),集合运算符会合并查询返回的行集,而不是单个数据项。所有集合运算符都具有相同的优先级。
|
@ -1,47 +0,0 @@
|
||||
算术运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
算术运算符用来对一个或两个参数进行求反、加、减、乘和除等操作。其中一些算术运算符还可用于计算日期时间和间隔值。算术运算符的参数必须解析为数字数据类型或任何可以被数据库直接转换为数字数据类型的数据类型。
|
||||
|
||||
一元算术运算符返回的数据类型与参数的数据类型相同。对于二进制算术运算符,OceanBase 先确定表达式中数值优先级最高的参数,再将其余参数转换为该参数的数据类型。
|
||||
|
||||
下表列出了算术运算符:
|
||||
|
||||
|
||||
| 运算符 | 说明 |
|
||||
|------|---------------------|
|
||||
| +、- | 用于表示正、负时,它们是一元运算符。 |
|
||||
| +、- | 用于表示加、减时,它们是二进制运算符。 |
|
||||
| \*、/ | 二进制运算符,用于表示乘、除。 |
|
||||
|
||||
|
||||
|
||||
算术表达式中不能使用两个连续的负号(--)来表示双重求反或减去一个负值,因为字符 -- 在 SQL 语句中用于指定注释。可以用空格或括号分隔连续的减号。有关 SQL 语句中的注释,详细信息请参阅章节 [注释](../../11.sql-reference-oracle-mode/3.basic-elements-1/6.annotation-1/1.annotation-overview.md)。
|
||||
|
||||
以下示例展示了运算符 +、- 用于表示正、负的 SQL 查询:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM order_items WHERE quantity = -1 ORDER BY order_id, line_item_id, product_id;
|
||||
SELECT * FROM employees WHERE -salary < 0 ORDER BY employee_id;
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下示例展示了运算符 +、- 用于表示加、减的 SQL 查询:
|
||||
|
||||
```javascript
|
||||
SELECT hire_date FROM employees WHERE SYSDATE - hire_date > 365 ORDER BY hire_date;
|
||||
```
|
||||
|
||||
|
||||
|
||||
以下示例展示了 \*、/ 运算符表示乘、除的 SQL 查询:
|
||||
|
||||
```javascript
|
||||
UPDATE employees SET salary = salary * 1.1;
|
||||
UPDATE employees SET salary = salary / 2;
|
||||
```
|
||||
|
||||
|
@ -1,32 +0,0 @@
|
||||
串联运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
串联运算符 \|\| 用于连接字符串和 `CLOB` 数据类型的数据。
|
||||
|
||||
连接两个字符串后会得到另一个字符串。如果两个字符串的数据类型均为 `CHAR`,则返回结果的数据类型也为 `CHAR`,并且限制为 2000 个字符。如果被合并的任一字符串的数据类型为 `VARCHAR2`,则返回结果的数据类型也为 `VARCHAR2`,并且限制为 4000 个字符。如果串联运算符两边的参数中任何一个是 `CLOB` 数据类型的值,则返回结果的数据类型为临时 `CLOB`。无论两边参数的数据类型是什么,字符串中的尾部空格都是通过串联保存的。
|
||||
|
||||
尽管 OceanBase 将长度为 0 的字符串视为空值(NULL),但是将一个带有值的操作数和另一个 0 长度字符串连接得到的结果是一个带值的操作数,因此 NULL 只能由两个值为 NULL 的字符串串联产生。但是,在将来的 OceanBase 数据库版本中,情况可能不会继续如此。要连接可能为空的表达式,请使用 NVL 函数将表达式直接转换为长度为 0 的字符串。
|
||||
|
||||
此示例创建了一个同时包含 `CHAR` 和 `VARCHAR2` 类型列的表,然后插入带有和不带有尾部空格的值,并将它们连接起来。
|
||||
|
||||
```javascript
|
||||
CREATE TABLE tab1 (col1 VARCHAR2(6), col2 CHAR(10), col3 VARCHAR2(10), col4 CHAR(6));
|
||||
INSERT INTO tab1 (col1, col2, col3, col4) VALUES ('abc', 'def ', 'ghi ', 'jkl');
|
||||
SELECT col1 || col2 || col3 || col4 "Concatenation" FROM tab1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
返回结果:
|
||||
|
||||
```javascript
|
||||
+----------------------------+
|
||||
| Concatenation |
|
||||
+----------------------------+
|
||||
| abcdef ghi jkl |
|
||||
+----------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,20 +0,0 @@
|
||||
层次查询运算符
|
||||
============================
|
||||
|
||||
|
||||
|
||||
`PRIOR` 和 `CONNECT_BY_ROOT` 运算符仅在 [层次查询](../../11.sql-reference-oracle-mode/8.queries-and-subqueries-1/3.hierarchical-query.md) 中有效。
|
||||
|
||||
PRIOR 运算符
|
||||
---------------------
|
||||
|
||||
在层次查询中,`CONNECT BY` 条件中应该包含至少一个由 `PRIOR` 运算符限定的表达式。`PRIOR` 运算符的结果,通过使用当前行的父行计算紧随后的表达式来得到。
|
||||
|
||||
`PRIOR` 最常用在列的等值比较场景中(`PRIOR` 可以在比较符的任意一侧)。理论上,在 `CONNECT BY` 子句中也可以使用等号(=)以外的其他运算符。但是,由这些其他运算符创建的条件可能会导致循环,在这种情况下,OceanBase 在运行时会检测循环并返回错误。
|
||||
|
||||
CONNECT_BY_ROOT 运算符
|
||||
----------------------------
|
||||
|
||||
`CONNECT_BY_ROOT` 是一元运算符,仅在层次查询中有效。`CONNECT_BY_ROOT` 的参数可以是列和大部分的表达式,`CONNECT_BY_ROOT` 运算符的结果,等于使用根行的数据计算参数的值。
|
||||
|
||||
您不能在 `START WITH` 条件或 `CONNECT BY` 条件中指定此运算符。
|
@ -1,18 +0,0 @@
|
||||
集合运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
集合运算符将两个查询结果合并为一个结果。包含集合运算符的查询称为复合查询。
|
||||
|
||||
|
||||
| 运算符 | 返回值 |
|
||||
|-----------|------------------------------------|
|
||||
| UNION | 返回任意查询选择的所有不同行。 |
|
||||
| UNION ALL | 返回任意查询选择的所有行,并包括所有重复项。 |
|
||||
| INTERSECT | 返回两个查询都选择的所有不同行。 |
|
||||
| MINUS | 返回第一个查询选择的所有不同行,但其中不包括出现在第二个查询中的行。 |
|
||||
|
||||
|
||||
|
||||
关于集合运算符的更多信息和示例,请参阅查询和子查询章节中关于 UNION ALL,INTERSECT,MINUS 运算符的介绍。
|
@ -1,49 +0,0 @@
|
||||
排序规则
|
||||
====
|
||||
|
||||
排序规则(即 COLLATE 运算符)用于指定字符序,可以用于重新设定字符类型的字符序或为单个表达式指定字符序。
|
||||
|
||||
COLLATE 是后缀一元运算符,与其它一元运算符优先级相同,但是在所有前缀一元运算符之后执行。COLLATE 运算符可以应用于 VARCHAR2,CHAR,LONG,NVARCHAR 或 NCHAR 类型的表达式。
|
||||
|
||||
COLLATE 运算符后跟一个参数 collation_name,表示需要设置或使用的字符序,字符序名称包含空格时必须在名称外加双引号。
|
||||
|
||||
举例如下:
|
||||
|
||||
```javascript
|
||||
obclient> create table t1(c1 varchar(20));
|
||||
obclient> insert into t1 values('a');
|
||||
obclient> insert into t1 values('b');
|
||||
obclient> insert into t1 values(1);
|
||||
obclient> select * from t1 order by c1 collate utf8mb4_general_ci;
|
||||
+------+
|
||||
| C1 |
|
||||
+------+
|
||||
| 1 |
|
||||
| a |
|
||||
| b |
|
||||
+------+
|
||||
3 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
目前支持如下排序规则:
|
||||
|
||||
```javascript
|
||||
obclient> show collation;
|
||||
+--------------------+---------+-----+---------+----------+---------+
|
||||
| COLLATION | CHARSET | ID | DEFAULT | COMPILED | SORTLEN |
|
||||
+--------------------+---------+-----+---------+----------+---------+
|
||||
| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
|
||||
| utf8mb4_bin | utf8mb4 | 46 | NULL | Yes | 1 |
|
||||
| binary | binary | 63 | Yes | Yes | 1 |
|
||||
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
|
||||
| gbk_bin | gbk | 87 | NULL | Yes | 1 |
|
||||
| utf16_general_ci | utf16 | 54 | Yes | Yes | 1 |
|
||||
| utf16_bin | utf16 | 55 | NULL | Yes | 1 |
|
||||
| utf8mb4_unicode_ci | utf8mb4 | 224 | NULL | Yes | 1 |
|
||||
| utf16_unicode_ci | utf16 | 101 | NULL | Yes | 1 |
|
||||
| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 |
|
||||
| gb18030_bin | gb18030 | 249 | NULL | Yes | 1 |
|
||||
+--------------------+---------+-----+---------+----------+---------+
|
||||
11 rows in set (0.01 sec)
|
||||
```
|
||||
|
@ -1,363 +0,0 @@
|
||||
函数概述
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
函数与运算符相似,即给定一些数据元素作为参数的输入并返回结果。然而函数在入参形式上与运算符有比较大的区别。函数允许包含的参数数量不定,一个函数里可以有一到两个,甚至更多的参数。
|
||||
|
||||
```javascript
|
||||
函数名(参数,参数,...)
|
||||
```
|
||||
|
||||
|
||||
|
||||
没有任何参数的函数类似于 [伪列](../../11.sql-reference-oracle-mode/2.pseudo-column.md)。但是,伪列通常为结果集中的每一行返回不同的值,而没有任何变量的函数通常为每一行返回相同的值。
|
||||
|
||||
关于函数
|
||||
----------------
|
||||
|
||||
OceanBase 内嵌的函数可以直接在 SQL 语句中使用。每个函数的入参传入值均有期望的数据类型,如果传入的数据类型不是期望的数据类型,则 OceanBase 会在实际执行 SQL 函数之前尝试将参数传入的数值转换为期望的数据类型。
|
||||
|
||||
函数中的空值
|
||||
------------------
|
||||
|
||||
对于绝大多数的函数当入参为空值 NULL 的时候,其返回的结果也为 NULL。这种情况下,您可以使用 `NVL` 函数返回一个非空值。例如,一张记录佣金的表的佣金列 **commission_pct** 为空值 NULL ,则表达式`NVL(commission_pct,0)` 返回 0;如果 **commission_pct** 的值不为 NULL,则返回实际的佣金值。
|
||||
|
||||
函数分类与列表
|
||||
-------------------
|
||||
|
||||
在如下的函数分类列表中,每一类函数的参数和最终的函数返回值都有其特定的数据类型。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
在 SQL 语句中对 `LOB` 列使用函数时,OceanBase 数据库将在 SQL 和 PL/SQL 处理期间创建临时 `LOB` 列,并有一定的使用限制。
|
||||
|
||||
本章中函数分成了两大类:
|
||||
|
||||
* **单行函数** :包括 数字函数、返回字符串的字符串函数、返回数字的字符串函数、 时间日期函数、通用比较函数、转换函数、编码解码函数和空值相关函数。
|
||||
|
||||
* **统计函数** :包括聚合函数和分析函数。
|
||||
|
||||
|
||||
|
||||
|
||||
单行函数对于被查询的表或者视图每一行均返回一个结果值,这些函数可以使用在 SQL 语句的 `SELECT`、`WHERE`、`START WITH`、`CONNECT BY`、`HAVING` 等子句当中。
|
||||
|
||||
分析函数与聚合函数,都是对行集组(一组行的集合)进行聚合计算,不同的是,聚合函数每组只能返回一个值(一行),而分析函数每组可以返回多个值(多行)。行集组又称为窗口(Window)。聚合函数通常和 `SELECT` 语句中的 `GROUP BY` 子句一起使用,使用时数据库将查询表或视图的行分为几组,并将聚合函数应用于每组行,同时为每组返回一个结果行。
|
||||
|
||||
使用分析函数时需要用特殊的关键字 `OVER` 来指定窗口。更多关于窗后函数的信息,请参阅文档 [窗口函数说明](../../11.sql-reference-oracle-mode/5.functions-1/4.analysis-functions-1/1.window-function-description.md)。
|
||||
|
||||
### 数字函数
|
||||
|
||||
数字函数的变量输入与函数输出结果均为数字类型,绝大部分的数字函数的返回值的数据类型为 `NUMBER`,可以精确到小数点后 38 位。一些高等代数相关函数 `COS`,`COSH`,`EXP`,`LN`,`LOG`,`SIN`,`SINH`,`SQRT`,`TAN`,`TANH` 等函数的结果精确到小数点后 36 位,其他代数相关函数 `ACOS`,`ASIN`,`ATAN` 和 `ATAN2`。其结果返回值精确到小数点后 30 位。
|
||||
|
||||
|
||||
| 函数分类 | 函数子分类 | 函数名 | 功能描述 |
|
||||
|------|-------|--------------|---------------------------------------------------------|
|
||||
| 单行函数 | 数字函数 | ABS | 返回指定数值表达式的绝对值(正值)的数学函数。 |
|
||||
| 单行函数 | 数字函数 | ACOS | 返回以弧度表示的角,其余弦为指定的 `NUMBER` 表达式,也称为反余弦。 |
|
||||
| 单行函数 | 数字函数 | ASIN | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | ATAN | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | ATAN2 | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | BITAND | 运算符按位进行"与"操作。输入和输出类型均为 `INT` 整型,且类型一致。 |
|
||||
| 单行函数 | 数字函数 | CEIL | 返回值大于等于数值 `numeric_expression` 的最小整数。 |
|
||||
| 单行函数 | 数字函数 | COS | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | COSH | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | EXP | 返回 e 的 numeric_expression 次幂。 |
|
||||
| 单行函数 | 数字函数 | FLOOR | 返回小于等于数值 `numeric_expression` 的最大整数。 |
|
||||
| 单行函数 | 数字函数 | LN | 返回以 e 为底的 `numeric_expression` 的对数。 |
|
||||
| 单行函数 | 数字函数 | LOG | 返回以 `x` 为底的 `y` 的对数。 |
|
||||
| 单行函数 | 数字函数 | MOD | 返回 `x` 除以 `y` 的余数。 |
|
||||
| 单行函数 | 数字函数 | POWER | 返回 `x` 的 `y` 次幂。 |
|
||||
| 单行函数 | 数字函数 | REMAINDER | 返回 `x` 除以 `y` 的余数。 |
|
||||
| 单行函数 | 数字函数 | ROUND | 返回 `numberic` 四舍五入后的值。 |
|
||||
| 单行函数 | 数字函数 | SIGN | 返回数字 `n` 的符号,大于 0 返回 1,小于 0 返回 -1 ,等于 0 返回 0。 |
|
||||
| 单行函数 | 数字函数 | SIN | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | SINH | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | SQRT | 返回 `n` 的平方根。 |
|
||||
| 单行函数 | 数字函数 | TAN | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | TANH | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 数字函数 | TRUNC | 返回 `numeric` 按精度 `precision` 截取后的值。 |
|
||||
| 单行函数 | 数字函数 | WIDTH_BUCKET | OceanBase 暂不支持。 |
|
||||
|
||||
|
||||
|
||||
### 返回字符串的字符串函数
|
||||
|
||||
函数的返回值的最大长度受数据类型的影响,比如:函数的返回值的数据类型是 `VARCHAR2`,但是返回值实际的大小超过了 `VARCHAR2` 数据类型的最大限制,此时 OceanBase 数据库会对结果进行截断处理并返回,但是在客户端上并不会显示提示。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
如果返回值的数据类型是 `CLOB`,当返回值长度超过了最大限制时,OceanBase 不会返回数据且显示错误提示。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-------------|----------------|----------------------------------------------|
|
||||
| 单行函数 | 返回字符串的字符串函数 | CHR | 将 `n` 转换为等价的一个或多个字符返回,且返回值与当前系统的字符集相关。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | CONCAT | 连接两个字符串。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | INITCAP | 返回字符串并将字符串中每个单词的首字母大写,其他字母小写。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | LOWER | 将字符串全部转为小写。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | LPAD | 在字符串 `c1` 的左边用字符串 `c2` 填充,直到长度为 `n` 时为止。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | LTRIM | 删除左边出现的字符串。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | REGEXP_REPLACE | 用于正则表达式替换。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | REGEXP_SUBSTR | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | REPLACE | 将字符表达式值中,部分相同字符串,替换成新的字符串。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | RPAD | 在字符串 `c1` 的右边用字符串 `c2` 填充,直到长度为 `n` 时为止。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | RTRIM | 删除右边出现的字符串,此函数对于格式化查询的输出非常有用。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | SUBSTR | 截取子字符串。其中多字节符(汉字、全角符等)按 1 个字符计算。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | TRANSLATE | 将字符表达式值中,指定字符替换为新字符。多字节符(汉字、全角符等),按 1 个字符计算。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | TRIM | 删除一个字符串的开头或结尾(或两者)的字符。 |
|
||||
| 单行函数 | 返回字符串的字符串函数 | UPPER | 将字符串全部转为大写。 |
|
||||
|
||||
|
||||
|
||||
### 返回数字的字符串函数
|
||||
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|------------|--------------|------------------------------|
|
||||
| 单行函数 | 返回数字的字符串函数 | ASCII | 返回字符表达式最左端字符的 ASCII 码值。 |
|
||||
| 单行函数 | 返回数字的字符串函数 | INSTR | 在一个字符串中搜索指定的字符,返回发现指定的字符的位置。 |
|
||||
| 单行函数 | 返回数字的字符串函数 | LENGTH | 返回字符串的长度。 |
|
||||
| 单行函数 | 返回数字的字符串函数 | REGEXP_COUNT | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 返回数字的字符串函数 | REGEXP_INSTR | OceanBase 暂不支持。 |
|
||||
|
||||
|
||||
|
||||
### 时间日期函数
|
||||
|
||||
时间日期函数支持的入参数据类型有三类:日期时间 (`DATE`)、时间戳 (`TIMESTAMP`、`TIMESTAMP WITH TIME ZONE`、`TIMESTAMP WITH LOCAL TIME ZONE`),以及间隔 (`INTERVAL DAY TO SECOND`、`INTERVAL YEAR TO MONTH`)
|
||||
|
||||
仅支持 `DATE` 数据类型入参的函数列表:`ADD_MONTHS`、`CURRENT_DATE, LAST_DAY`、`NEW_TIME` 和 `NEXT_DAY`。
|
||||
|
||||
如果对于以上函数,您尝试给入的是 `TIMESTAMP` 类型的数据,OceanBase 内部会先进行隐式数据类型转换后带入函数进行运算,并返回 `DATE` 类型的返回值。
|
||||
|
||||
在使用时间函数前,建议执行 `SELECT * FROM NLS_DATABASE_PARAMETERS` 查看当前的 NLS 格式:
|
||||
|
||||
```unknow
|
||||
obclient> SELECT * FROM NLS_DATABASE_PARAMETERS;
|
||||
+-------------------------+------------------------------+
|
||||
| PARAMETER | VALUE |
|
||||
+-------------------------+------------------------------+
|
||||
| NLS_DATE_FORMAT | DD-MON-RR |
|
||||
| NLS_TIMESTAMP_FORMAT | YYYY-MM-DD HH24:MI:SS |
|
||||
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
|
||||
| NLS_TERRITORY | AMERICA |
|
||||
| NLS_SORT | BINARY |
|
||||
| NLS_COMP | BINARY |
|
||||
| NLS_CHARACTERSET | AL32UTF8 |
|
||||
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
|
||||
| NLS_DATE_LANGUAGE | AMERICAN |
|
||||
| NLS_LENGTH_SEMANTICS | BYTE |
|
||||
| NLS_NCHAR_CONV_EXCP | FALSE |
|
||||
| NLS_CALENDAR | GREGORIAN |
|
||||
| NLS_NUMERIC_CHARACTERS | ., |
|
||||
+-------------------------+------------------------------+
|
||||
13 rows in set (0.05 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果与文中示例的显示格式不一致,可以执行如下命令更改格式:
|
||||
|
||||
```unknow
|
||||
obclient>ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
|
||||
obclient>ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
/*将返回值中秒的小数位设置为 9 位*/
|
||||
|
||||
obclient> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZR TZD';
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
* `MONTHS_BETWEEN` 返回值为 1 个数字。
|
||||
|
||||
|
||||
|
||||
* `ROUND` 和 `TRUNC` 并不能进行隐式转换,必须传输 `DATE` 类型的数值,否则会报错。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
剩余的函数对于三种参数数据类型均可以支持,且返回和入参同样的数据类型。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 单行函数 | 时间日期函数 | ADD_MONTHS | 返回在日期 `date` 基础上 `n` 个月后的日期值,如果 `n` 的值为负数则返回日期 `date` 基础上 `n` 个月前的日期值(`date` 减去 `n` 个月)。 |
|
||||
| 单行函数 | 时间日期函数 | CURRENT_DATE | 返回当前会话时区中的当前日期。 |
|
||||
| 单行函数 | 时间日期函数 | CURRENT_TIMESTAMP | 返回 `TIMESTAMP WITH TIME ZONE` 数据类型的当前会话时区中的当前日期,返回值中包含当前的时区信息。 |
|
||||
| 单行函数 | 时间日期函数 | DBTIMEZONE | 返回当前数据库实例的时区,在 OceanBase 中数据库时区恒为+00:00,且不支持修改。 |
|
||||
| 单行函数 | 时间日期函数 | EXTRACT (datetime) | 从指定的时间字段或表达式中抽取年、月、日、时、分、秒等元素。 |
|
||||
| 单行函数 | 时间日期函数 | FROM_TZ | 将一个 `TIMSTAMP` 数据类型的值和时区信息拼成一个 `TIMESTAMP WITH TIME ZONE` 数据类型的时间值。 |
|
||||
| 单行函数 | 时间日期函数 | LAST_DAY | 返回日期 `date` 所在月份的最后一天的日期。 |
|
||||
| 单行函数 | 时间日期函数 | LOCALTIMESTAMP | 返回当前会话时区中的当前日期,返回 `TIMESTAMP` 数据类型的值。 |
|
||||
| 单行函数 | 时间日期函数 | MONTHS_BETWEEN | 返回返回参数 `date1` 到 `date2` 之间的月数。 |
|
||||
| 单行函数 | 时间日期函数 | NEW_TIME | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 时间日期函数 | NEXT_DAY | 返回日期 `d1` 的下一周中 `c1`(星期值)所在的日期值。 |
|
||||
| 单行函数 | 时间日期函数 | NUMTODSINTERVAL | 把参数 `n` 转为以参数 `interval_unit` 为单位的 `INTERVAL DAY TO SECOND` 数据类型的值。 |
|
||||
| 单行函数 | 时间日期函数 | NUMTOYMINTERVAL | 把参数 `n` 转为以 `interval_unit` 为单位的 `INTERVAL YEAR TO MONTH` 数据类型的值。 |
|
||||
| 单行函数 | 时间日期函数 | ROUND (date) | 返回以参数 `fmt` 为单位距离的离指定日期 `date` 最近的日期时间值。 |
|
||||
| 单行函数 | 时间日期函数 | SESSIONTIMEZONE | 返回当前会话时区。 |
|
||||
| 单行函数 | 时间日期函数 | SYS_EXTRACT_UTC | 返回与指定时间相对应的的标准 UTC 时间。 |
|
||||
| 单行函数 | 时间日期函数 | SYSDATE | 返回当前日期。 |
|
||||
| 单行函数 | 时间日期函数 | SYSTIMESTAMP | 返回系统当前日期,返回值的秒的小数位包含 6 位精度,且包含当前时区信息。 |
|
||||
| 单行函数 | 时间日期函数 | TO_CHAR (datetime) | 将 `DATE`、`TIMESTAMP`、`TIMESTAMP WITH TIME ZONE`、`TIMESTAMP WITH LOCAL TIME ZONE`、`INTERVAL DAY TO SECOND` 和 `INTERVAL YEAR TO MONTH` 等数据类型的值按照参数 `fmt` 指定的格式转换为 `VARCHAR2` 数据类型的值。 |
|
||||
| 单行函数 | 时间日期函数 | TO_DSINTERVAL | 将一个 `CHAR`、`VARCHAR2`、`NCHAR` 或 `NVARCHAR2` 数据类型的字符串转换为一个 `INTERVAL DAY TO SECOND` 数据类型的值,该函数可以用来对一个日期时间值进行加减计算。 |
|
||||
| 单行函数 | 时间日期函数 | TO_TIMESTAMP | 将字符串转换为 `TIMESTAMP` 数据类型。 |
|
||||
| 单行函数 | 时间日期函数 | TO_TIMESTAMP_TZ | 将字符串转换为 `TIMESTAMP WITH TIME ZONE` 数据类型,包含时区信息。 |
|
||||
| 单行函数 | 时间日期函数 | TO_YMINTERVAL | 将一个 `CHAR`、`VARCHAR2`、`NCHAR` 或`NVARCHAR2` 数据类型的字符串转换为一个 `INTERVAL YEAR TO MONTH` 数据类型的值,该函数可以用来对一个日期时间值进行加减计算。 |
|
||||
| 单行函数 | 时间日期函数 | TRUNC (date) | 返回以参数 `fmt` 为单位距离的离指定日期 `date` 最近的日期时间值,并且返回的日期值在 `date` 之前。 |
|
||||
| 单行函数 | 时间日期函数 | TZ_OFFSET | 返回时区 `n` 的时区偏移量。时区偏移量是指与格林尼治标准时间 GMT 的差(小时和分钟)。 |
|
||||
|
||||
|
||||
|
||||
### 通用比较函数
|
||||
|
||||
可以通过本类别函数快速的在集合中寻找到最大值和最小值。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|----------|--------------------|
|
||||
| 单行函数 | 通用比较函数 | GREATEST | 返回一个或多个表达式列表中的最大值。 |
|
||||
| 单行函数 | 通用比较函数 | LEAST | 返回一个或多个表达式列表中的最小值。 |
|
||||
|
||||
|
||||
|
||||
### 转换函数
|
||||
|
||||
可以通过本类型的函数将原本的数据类型转换为另外一种数据类型。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
| 单行函数 | 转换函数 | ASCIISTR | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 转换函数 | BIN_TO_NUM | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 转换函数 | CHARTOROWID | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 转换函数 | HEXTORAW | 将 `CHAR`、`VARCHAR2`、`NCHAR` 或 `NVARCHAR2` 数据类型中包含十六进制数字的字符转换为 RAW 数据类型。 |
|
||||
| 单行函数 | 转换函数 | RAWTOHEX | 将二进制数转换为一个相应的十六进制表示的字符串。 |
|
||||
| 单行函数 | 转换函数 | TO_BINARY_DOUBLE | 返回一个双精度的 64 位浮点数. |
|
||||
| 单行函数 | 转换函数 | TO_BINARY_FLOAT | 返回一个单精度的 32 位浮点数。 |
|
||||
| 单行函数 | 转换函数 | TO_CHAR (character) | 将 `NCHAR`、`NVARCHAR2` 或 `CLOB` 数据转换为数据库字符集。 |
|
||||
| 单行函数 | 转换函数 | TO_CHAR (datetime) | 将 `DATE`、`TIMESTAMP`、`TIMESTAMP WITH TIME ZONE`、`TIMESTAMP WITH LOCAL TIME ZONE`、`INTERVAL DAY TO SECOND` 和 `INTERVAL YEAR TO MONTH` 等数据类型的值按照参数 `fmt` 指定的格式转换为 `VARCHAR2` 数据类型的值。 |
|
||||
| 单行函数 | 转换函数 | TO_CHAR (number) | 将 `NUMBER`、`BINARY_FLOAT` 或 `BINARY_DOUBLE` 类型的数值 `n` 按照指定数值格式 `fmt` 转换为 `varchar2` 数据类型的值。 |
|
||||
| 单行函数 | 转换函数 | TO_DATE | 将 `CHAR`、`VARCHAR`、`NCHAR` 或 `NVARCHAR2` 数据类型的字符转换为日期数据类型的值。 |
|
||||
| 单行函数 | 转换函数 | TO_DSINTERVAL | 将一个 `CHAR`、`VARCHAR2`、`NCHAR` 或 `NVARCHAR2` 数据类型的字符串转换为一个 `INTERVAL DAY TO SECOND` 数据类型的值,该函数可以用来对一个日期时间值进行加减计算。 |
|
||||
| 单行函数 | 转换函数 | TO_NUMBER | 将 `expr` 转换为数值数据类型的值。 |
|
||||
| 单行函数 | 转换函数 | TO_TIMESTAMP | 将字符串转换为 `TIMESTAMP` 数据类型。 |
|
||||
| 单行函数 | 转换函数 | TO_TIMESTAMP_TZ | 将字符串转换为 `TIMESTAMP WITH TIME ZONE` 数据类型,包含时区信息。 |
|
||||
| 单行函数 | 转换函数 | TO_YMINTERVAL | 将一个 `CHAR`、`VARCHAR2`、`NCHAR` 或 `NVARCHAR2` 数据类型的字符串转换为一个 `INTERVAL YEAR TO MONTH` 数据类型的值,该函数可以用来对一个日期时间值进行加减计算。 |
|
||||
|
||||
|
||||
|
||||
### 编码解码函数
|
||||
|
||||
可以通过本类型的函数在 OceanBase 数据库中实现数据的编码解密需求。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|----------|------------------|
|
||||
| 单行函数 | 编码解码函数 | DECODE | 会根据条件返回相应值。 |
|
||||
| 单行函数 | 编码解码函数 | ORA_HASH | 获取对应表达式的 HASH 值。 |
|
||||
| 单行函数 | 编码解码函数 | VSIZE | 返回 `X` 的字节大小数。 |
|
||||
|
||||
|
||||
|
||||
### 空值相关函数
|
||||
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|----------|--------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 单行函数 | 空值相关函数 | COALESCE | 返回参数列表中第一个非空表达式,必须指定最少两个参数。 |
|
||||
| 单行函数 | 空值相关函数 | LNNVL | 判断条件中的一个或者两个操作数是否为 `NULL`。 |
|
||||
| 单行函数 | 空值相关函数 | NULLIF | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 空值相关函数 | NVL | 从两个表达式返回一个非 NULL 值。如果 `expr1` 与 `expr2` 的结果皆为 NULL 值,则 NVL 函数返回 NULL。 |
|
||||
| 单行函数 | 空值相关函数 | NVL2 | 根据表达式是否为空,返回不同的值。如果 `expr1` 不为空,则返回 `expr2` 的值,如果 `expr1` 为空,则返回 `expr3` 的值。`expr2` 和 `expr3` 类型不同的话,`expr3` 会转换为 `expr1` 的类型。 |
|
||||
|
||||
|
||||
|
||||
### 环境相关函数
|
||||
|
||||
本分类的函数主要提供会话或者租户实例相关的环境信息。
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|-------------|-----------------|
|
||||
| 单行函数 | 环境相关函数 | SYS_CONTEXT | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 环境相关函数 | UID | OceanBase 暂不支持。 |
|
||||
| 单行函数 | 环境相关函数 | USER | OceanBase 暂不支持。 |
|
||||
|
||||
|
||||
|
||||
### 聚合函数
|
||||
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|-----------------------|-----------------------------------------------------------|
|
||||
| 统计函数 | 聚合函数 | AVG | 返回数值列的平均值。 |
|
||||
| 统计函数 | 聚合函数 | COUNT | 用于查询参数 `expr` 的行数。 |
|
||||
| 统计函数 | 聚合函数 | SUM | 返回参数中指定列的和。 |
|
||||
| 统计函数 | 聚合函数 | GROUPING | OceanBase 暂不支持。 |
|
||||
| 统计函数 | 聚合函数 | MAX | 返回参数中指定的列中的最大值。 |
|
||||
| 统计函数 | 聚合函数 | MIN | 返回参数中指定列的最小值。 |
|
||||
| 统计函数 | 聚合函数 | LISTAGG | 用于列转行,`LISTAGG` 对 `ORDER BY` 子句中指定的每个组内的数据进行排序,然后合并度量列的值。 |
|
||||
| 统计函数 | 聚合函数 | ROLLUP | 在数据统计和报表生成过程中,它可以为每个分组返回一个小计,同时为所有分组返回总计。 |
|
||||
| 统计函数 | 聚合函数 | STDDEV | 用于计算总体标准差。 |
|
||||
| 统计函数 | 聚合函数 | STDDEV_POP | 计算总体标准差。 |
|
||||
| 统计函数 | 聚合函数 | STDDEV_SAMP | 计算样本标准差。 |
|
||||
| 统计函数 | 聚合函数 | VARIANCE | 返回参数指定列的方差。 |
|
||||
| 统计函数 | 聚合函数 | APPROX_COUNT_DISTINCT | 计算某一列去重后的行数,返回的值是一个近似值,该函数可以进一步用于计算被引用的列的选择性。 |
|
||||
|
||||
|
||||
|
||||
### 分析函数
|
||||
|
||||
|
||||
|
||||
| **函数分类** | **函数子分类** | **函数名** | **功能描述** |
|
||||
|----------|-----------|-----------------|------------------------------------------------------------------------------------|
|
||||
| 统计函数 | 分析函数 | AVG | 返回数值列的平均值。 |
|
||||
| 统计函数 | 分析函数 | COUNT | 用于查询参数 `expr` 的行数。 |
|
||||
| 统计函数 | 分析函数 | CUME_DIST | 计算一个值在一组值中的累积分布。 |
|
||||
| 统计函数 | 分析函数 | DENSE_RANK | 计算有序行组中行的秩,并将秩作为 `NUMBER` 返回。 |
|
||||
| 统计函数 | 分析函数 | MAX | 返回参数中指定的列中的最大值。 |
|
||||
| 统计函数 | 分析函数 | MIN | 返回参数中指定列的最小值。 |
|
||||
| 统计函数 | 分析函数 | SUM | 返回参数中指定列的和。 |
|
||||
| 统计函数 | 分析函数 | FIRST_VALUE | 返回有序值中的第一个值。 |
|
||||
| 统计函数 | 分析函数 | LAG | 提供对多行表的访问,而不需要自连接。 |
|
||||
| 统计函数 | 分析函数 | LAST_VALUE | 返回一组有序值中的最后一个值。 |
|
||||
| 统计函数 | 分析函数 | LEAD | 它提供了对表多行的访问,而无需进行自我连接。给定从查询返回的一些列行和光标的位置,`LEAD` 提供超出该位置的物理偏移量的行的访问。 |
|
||||
| 统计函数 | 分析函数 | LISTAGG | 用于列转行。 |
|
||||
| 统计函数 | 分析函数 | NTH_VALUE | 返回 `analytic_clause` 定义的窗口中第 `n` 行的 `measure_expr` 值。 |
|
||||
| 统计函数 | 分析函数 | NTILE | 将有序数据集划分为 `expr` 指示的若干桶,并为每一行分配适当的桶号。 |
|
||||
| 统计函数 | 分析函数 | PERCENT_RANK | 类似于 `CUME_DIST`(累积分布)函数。 它的返回值范围为 0\~1。任何集合中的第一行的`PERCENT_RANK` 函数为 0,返回值为 NUMBER。 |
|
||||
| 统计函数 | 分析函数 | SUM | 返回参数中指定列的和。 |
|
||||
| 统计函数 | 分析函数 | RANK | 基于 `OVER` 子句中的 `ORDER BY` 表达式确定一组值的排名。 |
|
||||
| 统计函数 | 分析函数 | RATIO_TO_REPORT | 计算一个值与一组值之和的比率。 |
|
||||
| 统计函数 | 分析函数 | ROW_NUMBER | 为应用它的每一行分配一个唯一的数字。 |
|
||||
| 统计函数 | 分析函数 | STDDEV | 用于计算总体标准差。 |
|
||||
| 统计函数 | 分析函数 | STDDEV_POP | 计算总体标准差。 |
|
||||
| 统计函数 | 分析函数 | STDDEV_SAMP | 计算样本标准差。 |
|
||||
| 统计函数 | 分析函数 | VARIANCE | 返回参数指定列的方差。 |
|
||||
|
||||
|
||||
|
||||
更多信息
|
||||
----------------
|
||||
|
||||
分析函数中的关键字 `OVER`,请参阅 [窗口函数说明](../../11.sql-reference-oracle-mode/5.functions-1/4.analysis-functions-1/1.window-function-description.md)。
|
@ -1,56 +0,0 @@
|
||||
ABS
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`ABS` 函数是返回指定数值表达式的绝对值(正值)的数学函数。`ABS` 将负值更改为正值,对零或正值没有影响。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
ABS (numeric_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------|
|
||||
| numeric_expression | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回与 `numeric_expression` 相同的类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
本示例显示了对三个不同数字使用 `ABS` 函数所得的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT ABS(-1.0), ABS(0.0), ABS(1.0), ABS(1.666) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------+----------+----------+------------+
|
||||
| ABS(-1.0) | ABS(0.0) | ABS(1.0) | ABS(1.666) |
|
||||
+-----------+----------+----------+------------+
|
||||
| 1 | 0 | 1 | 1.666 |
|
||||
+-----------+----------+----------+------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
POWER
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`POWER` 函数返回 `x` 的 `y` 次幂。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
POWER (x, y)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|-----|-----------------------------------------------------------------------|
|
||||
| x,y | `x` 和 `y` 为数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
当参数为 `BINARY_FLOAT` 和 `BINARY_DOUBLE` 数据类型时,返回类型为 `BINARY_DOUBLE`,其他情况下返回类型为 `NUMBER`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了对三组不同数字使用 `POWER` 函数所得的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT POWER(2,2), POWER(1.5,0), POWER(20, -1) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------+--------------+--------------+
|
||||
| POWER(2,2) | POWER(1.5,0) | POWER(20,-1) |
|
||||
+------------+--------------+--------------+
|
||||
| 4 | 1 | .05 |
|
||||
+------------+--------------+--------------+
|
||||
```
|
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
REMAINDER
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`REMAINDER` 函数返回 `x` 除以 `y` 的余数。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
与 MOD 函数的区别为:
|
||||
|
||||
在用 `REMAINDER (x,y)` 和 `MOD (x,y)` 函数在进行运算时,都用了一个公式 result=x-y\*(x/y),区别在于计算 x/y 时的处理方式不同。在 `REMAINDER (x,y)` 函数中,采用 `ROUND(x/y)`,而在 `MOD (x,y)` 函数中采用 `FLOOR(x/y)`。在`REMAINDER` 函数中,当 `ROUND(x/y)` 的参数 x/y 的值的小数部分恰好为 0.5 时,如果 x/y 的值的整数部分为偶数,不向前一位进位,当 x/y 的值的整数部分为奇数,向前一位进位。例如,`ROUND(1.5)`=2、`ROUND(2.5)`=2、`ROUND(3.5)`=4、`ROUND(4.5)`=4。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
REMAINDER (x, y)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **说明** |
|
||||
|--------|-----------------------------------------------------------------------|
|
||||
| x,y | `x` 和 `y` 为数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与数值优先级高的参数的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了使用 `MOD` 以及 `REMAINDER` 函数计算 1.5/1 的余数的结果,请注意两个函数的区别。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT MOD(1.5,1), REMAINDER(1.5,1) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------+------------------+
|
||||
| MOD(1.5,1) | REMAINDER(1.5,1) |
|
||||
+------------+------------------+
|
||||
| .5 | -.5 |
|
||||
+------------+------------------+
|
||||
```
|
||||
|
||||
|
@ -1,57 +0,0 @@
|
||||
ROUND
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`ROUND` 函数返回参数 `numeric` 四舍五入后的值。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
ROUND (numeric[,decimal])
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| numeric | 数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 |
|
||||
| decimal | 如果 `decimal` 大于等于 0 则将 `numeric` 四舍五入到 `decimal` 位小数,如果 `decimal` 小于 0 则四舍五入到小数点向左第 `decimal` 位。当 `decimal` 不为整数时,截取 `decimal` 的整数部分。不指定 `decimal` 时,将 `numeric` 四舍五入到整数位。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
不指定 `decimal` 时返回类型与参数 `numeric` 的类型相同,指定 `decimal` 时,返回类型为 `NUMBER` 数据类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了在 `decimal` 的不同值下四舍五入 5555.6666 的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT ROUND(5555.6666, 2.1), ROUND(5555.6666, -2.6), ROUND(5555.6666) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+----------------------+-----------------------+------------------+
|
||||
| ROUND(5555.6666,2.1) | ROUND(5555.6666,-2.6) | ROUND(5555.6666) |
|
||||
+----------------------+-----------------------+------------------+
|
||||
| 5555.67 | 5600 | 5556 |
|
||||
+----------------------+-----------------------+------------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
SIGN
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
`SIGN` 函数返回数字 `n` 的符号,大于 0 返回 1,小于 0 返回 -1 ,等于 0 返回 0。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
SIGN (n)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **说明** |
|
||||
|--------|-----------------------------------------------------------------------|
|
||||
| n | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回数值 0,1 和 -1。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了对三个不同数字使用 `SIGN` 函数所得的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT SIGN(100), SIGN(-100), SIGN(0) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------+------------+---------+
|
||||
| SIGN(100) | SIGN(-100) | SIGN(0) |
|
||||
+-----------+------------+---------+
|
||||
| 1 | -1 | 0 |
|
||||
+-----------+------------+---------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
SQRT
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
`SQRT` 函数返回 `n` 的平方根。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
SQRT (n)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **说明** |
|
||||
|--------|---------------------------------------------------------------------------------------|
|
||||
| n | 数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 `n` 不能为负数。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与参数 `n` 的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了对两个不同数字使用 `SQRT` 函数求平方根的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT SQRT(64), SQRT(10) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+----------+------------------------------------------+
|
||||
| SQRT(64) | SQRT(10) |
|
||||
+----------+------------------------------------------+
|
||||
| 8 | 3.16227766016837933199889354443271853372 |
|
||||
+----------+------------------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
TRUNC
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`TRUNC` 函数返回 `numberic` 按精度 `precision` 截取后的值。
|
||||
|
||||
语法
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
TRUNC (numberic[,precision])
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| numberic,precision | 数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。如果 `precision` 不为整数则截取 `precision` 的整数部分。`precision` 大于等于 0 时截取 `numeric` 到 `precision` 位小数, `precision` 小于 0 时截取到 `numeric` 小数点向左第 `precision` 位,小数前其它数据用 0 表示。 `precision` 的默认值为 0。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
不指定 `precision` 时,返回类型与参数 `numberic` 的数据类型相同。指定 `precision` 时,返回类型为 `NUMBER`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了在 `precision` 的不同值下 5555.66666的计算结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TRUNC(5555.66666, 2.1), TRUNC(5555.66666, -2.6), TRUNC(5555.66666) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------------------+------------------------+--------------------+
|
||||
| TRUNC(5555.66666,2.1) | TRUNC(5555.66666,-2.6) | TRUNC(5555.033333) |
|
||||
+-----------------------+------------------------+--------------------+
|
||||
| 5555.66 | 5500 | 5555 |
|
||||
+-----------------------+------------------------+--------------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
ACOS
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
`ACOS` 函数返回以弧度表示的角,其余弦为指定的 `NUMBER` 表达式,也称为反余弦。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
ACOS (num_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 值 | 说明 |
|
||||
|----------------|-------------|--------------------------------------------------------------------------------------------|
|
||||
| num_expression | -1.00\~1.00 | `NUMBER` 类型或可隐式转换为 `NUMBER` 类型的表达式 。 仅介于 -1.00 到 1.00 之间的值有效。 对于超出此范围的值,将返回 `NULL` 且报告域错误。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
`NUMBER` 数据类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例返回指定数量的 `ACOS` 的值。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT ACOS(0.3)"acos_test" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------+
|
||||
| acos_test |
|
||||
+-----------+
|
||||
|1.26610367 |
|
||||
+-----------+
|
||||
```
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
BITAND
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
运算符按位进行"与"操作。输入和输出类型均为 `NUMBER` 数据类型。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
BITAND (nExpression1, nExpression2)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----------------------------|------------------------------------------------------------------------------------------|
|
||||
| nExpression1, nExpression2 | 指定按位进行 `AND` 运算的两个数值。如果 `nExpression1` 和 `nExpression2` 为非整数型,那么它们在按位进行 `AND` 运算之前转换为整数。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
`NUMBER` 数据类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
a 的二进制为 0100;
|
||||
|
||||
b 的二进制为 0110;
|
||||
|
||||
比较该二进制,若相对应的位置都为 1,则该位的值为 1,否则值为 0。所以 BITAND(2 , 3) = 0100 = 2。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT BITAND(2,3) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------+
|
||||
| BITAND(2,3) |
|
||||
+-------------+
|
||||
| 2 |
|
||||
+-------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
CEIL
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
`CEIL` 函数返回值大于等于数值 `numeric_expression` 的最小整数。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
CEIL (numeric_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------|
|
||||
| numeric_expression | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与参数 `numeric_expression` 的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了对三个不同数字使用 `CEIL` 函数所得的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT CEIL(1.2), CEIL(2), CEIL(-12.1) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------+---------+-------------+
|
||||
| CEIL(1.2) | CEIL(2) | CEIL(-12.1) |
|
||||
+-----------+---------+-------------+
|
||||
| 2 | 2 | -12 |
|
||||
+-----------+---------+-------------+
|
||||
```
|
||||
|
||||
|
@ -1,57 +0,0 @@
|
||||
EXP
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`EXP` 函数返回 e 的 `numeric_expression` 次幂(e 为数学常量,e = 2.71828183... )。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
EXP (numeric_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------|
|
||||
| numeric_expression | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与参数 `numeric_expression` 的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了查询 e 的 4 次幂结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT EXP(4) "e to the 4th power" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------------------------------+
|
||||
| e to the 4th power |
|
||||
+-------------------------------------------+
|
||||
| 54.59815003314423907811026120286087840279 |
|
||||
+-------------------------------------------+
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
FLOOR
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`FLOOR` 函数返回小于等于数值 `numeric_expression` 的最大整数。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
FLOOR (numeric_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------|
|
||||
| numeric_expression | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与参数 `numeric_expression` 的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了对三个不同数字使用 `FLOOR` 函数所得的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT FLOOR(1.2), FLOOR(2), FLOOR(-12.1) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------+----------+--------------+
|
||||
| FLOOR(1.2) | FLOOR(2) | FLOOR(-12.1) |
|
||||
+------------+----------+--------------+
|
||||
| 1 | 2 | -13 |
|
||||
+------------+----------+--------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
LN
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
`LN` 函数返回以 e 为底的 `numeric_expression` 的对数(e 为数学常量 e = 2.71828183...)。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
LN (numeric_expression)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|--------------------|-----------------------------------------------------------------------|
|
||||
| numeric_expression | 精确数值或近似数值数据类型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)的表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
当参数为 `BINARY_FLOAT` 数据类型时,返回类型为 `BINARY_DOUBLE`,其他情况下返回类型与参数 `numeric_expression` 的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了计算以 e 为底的 4 次对数的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT LN(4) "Natural log of 4" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------------------------------------+
|
||||
| Natural log of 4 |
|
||||
+------------------------------------------+
|
||||
| 1.38629436111989061883446424291635313615 |
|
||||
+------------------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
LOG
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`LOG` 函数返回以 `x` 为底的 `y` 的对数。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
LOG (x,y)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|-----|-----------------------------------------------------------------------------------------------|
|
||||
| x,y | 数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 `x` 和 `y` 都必须大于 0。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
当参数为 `BINARY_FLOAT` 和 `BINARY_DOUBLE` 数据类型时,返回类型为 `BINARY_DOUBLE`,其他情况下返回类型为 `NUMBER`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了查询了以 2 为底的 8 的对数。
|
||||
|
||||
```javascript
|
||||
SELECT LOG(2,8) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+----------+
|
||||
| LOG(2,8) |
|
||||
+----------+
|
||||
| 3 |
|
||||
+----------+
|
||||
```
|
||||
|
||||
|
@ -1,61 +0,0 @@
|
||||
MOD
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`MOD` 函数返回 `x` 除以 `y` 的余数。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
与 REMAINDER 函数的区别为,在用 `REMAINDER (x,y)` 和 `MOD (x,y)` 函数在进行运算时,都用了一个公式 result=x-y\*(x/y),区别在于计算 x/y 时的处理方式不同。在 `REMAINDER (x,y)` 函数中,采用 `ROUND(x/y)`,而在 `MOD (x,y)` 函数中采用 `FLOOR(x/y)`。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
MOD (x,y)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|-----|-----------------------------------------------------------------------|
|
||||
| x,y | `x` 和 `y` 为数值型(`NUMBER`、`FLOAT`、`BINARY_FLOAT` 和 `BINARY_DOUBLE`)表达式。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回类型与数值优先级高的参数的数据类型相同。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
此示例显示了计算 23/8 以及 24/8 的余数的结果。
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT MOD(23,8), MOD(24,8) FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------+-----------+
|
||||
| MOD(23,8) | MOD(24,8) |
|
||||
+-----------+-----------+
|
||||
| 7 | 0 |
|
||||
+-----------+-----------+
|
||||
```
|
||||
|
||||
|
@ -1,98 +0,0 @@
|
||||
CHR
|
||||
========================
|
||||
|
||||
|
||||
|
||||
`CHR` 函数将 `n` 转换为等价的一个或多个字符返回,且返回值与当前系统的字符集相关。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
CHR ( n )
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **取值范围** |
|
||||
|--------|---------------|
|
||||
| n | 0\~4294967295 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回值与当前系统的字符集相关。而 OceanBase 支持的字符集是 `UTF-8`、`UTF-16`、`GBK` 和 `GB18030`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
十进制(25700)-\> 十六进制(0x6464)-\>`UTF-8` 编码(dd)
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT CHR(25700) AS str FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------+
|
||||
| STR |
|
||||
+------+
|
||||
| dd |
|
||||
+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
十进制(50318)-\> 十六进制(0xC48E)-\> `UTF-8` 编码(Ď)
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT CHR(50318) AS str FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------+
|
||||
| STR |
|
||||
+------+
|
||||
| Ď |
|
||||
+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
十进制 -\> `UTF-8` 编码
|
||||
|
||||
```javascript
|
||||
SELECT CHR(67)||CHR(65)||CHR(84) "Dog" FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------+
|
||||
| Dog |
|
||||
+------+
|
||||
| CAT |
|
||||
+------+
|
||||
```
|
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
RTRIM
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`RTRIM` 函数删除右边出现的字符串,此函数对于格式化查询的输出非常有用。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
RTRIM(c1 [,c2])
|
||||
```
|
||||
|
||||
|
||||
|
||||
`RTRIM` 从 `c1` 中出现的所有字符的右端删除 `c2`。如果未指定 `c2`,则默认为单个空格。
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|-----------------|
|
||||
| c1 | 表示字符串 |
|
||||
| c2 | 表示要删除的字符串,默认为空格 |
|
||||
|
||||
|
||||
|
||||
`c1`、`c2` 可以是 `CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 和 `CLOB` 数据类型。
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
如果 `c1` 是 `CHAR`、`VARCHAR2` 数据类型,则函数返回 `VARCHAR2` 数据类型。
|
||||
|
||||
如果 `c1` 是 `NCHAR`、`NVARCHAR2` 数据类型,则函数返回 `NVARCHAR2` 数据类型。
|
||||
|
||||
如果 `c1` 是 `LOB` 数据类型,则返回的字符串为 `LOB` 数据类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT RTRIM('gao qian jingXXXX','X') text FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------------+
|
||||
| TEXT |
|
||||
+------------------+
|
||||
| gao qian jing |
|
||||
+------------------+
|
||||
```
|
||||
|
||||
|
@ -1,56 +0,0 @@
|
||||
SUBSTR
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
`SUBSTR` 函数截取子字符串。其中多字节符(汉字、全角符等)按 1 个字符计算。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
SUBSTR(c1,n1[,n2])
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|------------------------------------------------------------------|
|
||||
| c1 | 需要截取的字符串。字符串类型可为:`CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB`。 |
|
||||
| n1 | 截取字符串的开始位置,当 n1 等于 0 或 1 时,都是从第一位开始截取。 |
|
||||
| n2 | 要截取的字符串的长度,若不指定 `n2`,则从第 `n1` 个字符直到结束的字串。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回与 `c1` 类型相同的数据。如果 `n2` 为 0,则将其视为 1。如果 `n2` 为正,则 OceanBase 从开始算起,从 `c1` 开始查找第一个字符。如果 `n2` 为负,则 OceanBase 从 `c1` 的末尾开始倒数 `c1`。如果 `n3` 省略,则 OceanBase 将 `c1` 的所有字符返回。如果 `n3` 小于 1,则 OceanBase 返回 `NULL`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT SUBSTR('13088888888',3,8) test FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+----------+
|
||||
| TEST |
|
||||
+----------+
|
||||
| 08888888 |
|
||||
+----------+
|
||||
```
|
||||
|
||||
|
@ -1,82 +0,0 @@
|
||||
TRANSLATE
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
`TRANSLATE` 函数将字符表达式值中,指定字符替换为新字符。多字节符(汉字、全角符等),按 1 个字符计算。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
TRANSLATE(c1,c2,c3)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|-----------------------------------------|
|
||||
| c1 | 希望被替换的字符或变量。 |
|
||||
| c2 | 查询原始的字符集。 |
|
||||
| c3 | 替换新的字符集,将 `c2` 对应顺序字符,替换为 `c3` 对应顺序字符 。 |
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* `c1`、`c2` 和 `c3` 的数据类型可以是 `CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB`。
|
||||
|
||||
|
||||
|
||||
* 如果 `c3` 长度大于 `c2`,则 `c3` 长出后面的字符无效;
|
||||
|
||||
|
||||
|
||||
* 如果 `c3` 长度小于 `c2`,则 `c2` 长出后面的字符均替换为空(删除);
|
||||
|
||||
|
||||
|
||||
* 如果 `c3` 长度为 0,则返回空字符串;
|
||||
|
||||
|
||||
|
||||
* 如果 `c2` 里字符重复,按首次位置为替换依据。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回 `CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB` 类型字符。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TRANSLATE('he miss you','he','i') FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+---------------------------------+
|
||||
| TRANSLATE('HEMISSYOU','HE','I') |
|
||||
+---------------------------------+
|
||||
| i miss you |
|
||||
+---------------------------------+
|
||||
```
|
||||
|
||||
|
@ -1,66 +0,0 @@
|
||||
TRIM
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
`TRIM` 函数用来删除一个字符串的开头或结尾(或两者)的字符。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
TRIM([ { { LEADING | TRAILING | BOTH } [ trim_character ] | trim_character } FROM ] trim_source)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----------------|----------|
|
||||
| LEADING | 开头字符。 |
|
||||
| TRAILING | 结尾字符。 |
|
||||
| BOTH | 开头和结尾字符。 |
|
||||
| trim_character | 删除的字符。 |
|
||||
| trim_source | 修剪源。 |
|
||||
|
||||
|
||||
|
||||
`trim_char` 和 `trim_source` 都可以是 `VARCHAR2` 或任何可以隐式转换为 `VARCHAR2` 的数据类型。如果指定 `LEADING`,则 OceanBase 将删除所有与前导字符相等的 `trim_character`。如果指定 `TRAILING`,则 OceanBase 将删除所有与结尾字符相等的 `trim_character`。如果您指定 `BOTH` 或三个都不指定,则 OceanBase 删除与前导和结尾字符相等的 `trim_character`。如果未指定 `trim_character`,则默认值为空白。如果仅指定 `trim_source`,则 OceanBase 删除前导和尾随空格。如果函数返回的值数据类型为 `VARCHAR2`,则该值的最大长度为 `trim_source`。
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
如果 `trim_source` 为 `CHAR`、`VARCHAR2` 数据类型,则函数返回 `VARCHAR2` 数据类型。
|
||||
|
||||
如果 `trim_source` 为 `NCHAR`、`NVARCHAR2` 数据类型,则函数返回 `NVARCHAR2` 数据类型。
|
||||
|
||||
如果 `trim_source` 为 `CLOB` 数据类型,则函数返回 `CLOB` 数据类型。
|
||||
|
||||
如果 `trim_source` 或 `trim_character` 为 `NULL`,则 `TRIM` 函数返回 `NULL`。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT TRIM('X' from 'XXXgao qian jingXXXX'),TRIM('X' from 'XXXgaoXXjingXXXX') text FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-----------------------------------+-----------+
|
||||
| TRIM('X'FROM'XXXGAOQIANJINGXXXX') | TEXT |
|
||||
+-----------------------------------+-----------+
|
||||
| gao qian jing | gaoXXjing |
|
||||
+-----------------------------------+-----------+
|
||||
```
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
UPPER
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
`UPPER` 函数将字符串全部转为大写。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
UPPER(c1)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|-------------------------------------------------------------|
|
||||
| c1 | 字符串。字符串类型可为:`CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB`。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回 `CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB` 类型的字符。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT UPPER('AaBbCcDd') upper FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+----------+
|
||||
| UPPER |
|
||||
+----------+
|
||||
| AABBCCDD |
|
||||
+----------+
|
||||
```
|
||||
|
||||
|
@ -1,57 +0,0 @@
|
||||
CONCAT
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
`CONCAT` 函数可以连接两个字符串。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
CONCAT(c1,c2)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|-------------------------------------------------------------|
|
||||
| c1 | 字符串,字符串类型可为:`CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB`。 |
|
||||
| c1 | 字符串,字符串类型可为:`CHAR`、`VARCHAR2`、`NCHAR`、`NVARCHAR2` 或 `CLOB`。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回与 `c1` 相同的数据类型。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
本示例 `CONCAT` 函数用来连接字符 `'010-'` 和字符 `'88888888'`。
|
||||
|
||||
执行以下语句
|
||||
|
||||
```javascript
|
||||
SELECT concat('010-','88888888')||'转23'XXXX的电话 FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+-------------------+
|
||||
| XXXX的电话 |
|
||||
+-------------------+
|
||||
| 010-88888888转23 |
|
||||
+-------------------+
|
||||
```
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
INITCAP
|
||||
============================
|
||||
|
||||
|
||||
|
||||
`INITCAP` 函数返回字符串并将字符串中每个单词的首字母大写,其他字母小写。
|
||||
|
||||
语法
|
||||
--------------
|
||||
|
||||
```javascript
|
||||
INITCAP(c1)
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 说明 |
|
||||
|----|------------------------------------------------------|
|
||||
| c1 | 字符串。字符串类型可为:`CHAR`、`VARCHAR2`、`NCHAR` 或 `NVARCHAR2`。 |
|
||||
|
||||
|
||||
|
||||
返回类型
|
||||
----------------
|
||||
|
||||
返回 `CHAR` 类型数据。
|
||||
|
||||
示例
|
||||
--------------
|
||||
|
||||
执行以下语句:
|
||||
|
||||
```javascript
|
||||
SELECT initcap('smith abc aBC') upp FROM DUAL;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查询结果如下:
|
||||
|
||||
```javascript
|
||||
+------------------+
|
||||
| UPP |
|
||||
+------------------+
|
||||
| Smith Abc Abc |
|
||||
+------------------+
|
||||
```
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user