---
title: "查询计算函数 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 查询计算函数 OceanBase 数据库 Oracle 模式支持通过 SDO_GEOMETRY 类型的四个成员函数查询 SDO_GEOMETRY 空间对象的维度、类型以及有效性信息；同时支持通过 SDO_GEOM 包中的函数 SDO_DISTANCE() 和其他函数 SDO_RELATE() 来计算空间对象的距离和关…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 查询计算函数

更新时间：2026-04-02 10:20:25

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/300.common-tenant-of-oracle-mode/500.functions-of-oracle-mode/200.single-row-functions-of-oracle-mode/1400.spatial-functions-of-oracle-mode/300.sdo-geometry-query-functions-of-oracle-mode.md)  

OceanBase 数据库 Oracle 模式支持通过 `SDO_GEOMETRY` 类型的四个成员函数查询 `SDO_GEOMETRY` 空间对象的维度、类型以及有效性信息；同时支持通过 `SDO_GEOM` 包中的函数 `SDO_DISTANCE()` 和其他函数 `SDO_RELATE()` 来计算空间对象的距离和关系信息。

## `SDO_GEOMETRY` 类型

### GET_DIMS() 和 ST_COORDDIM()

`GET_DIMS()` 和 `ST_COORDDIM()` 函数用于获取空间对象的维度（即几何对象的坐标数）。例如，对于二维对象，维度为 2；对于三维对象，维度为 3。

**示例如下：**

```sql
SELECT SDO_GEOMETRY(2001, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,1), SDO_ORDINATE_ARRAY(10,500)).GET_DIMS() AS test_get_dims FROM dual;

```

返回结果如下：

```shell
+---------------+
| TEST_GET_DIMS |
+---------------+
|             2 |
+---------------+
1 row in set

```

```sql
SELECT SDO_GEOMETRY(2001, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,1), SDO_ORDINATE_ARRAY(10,500)).ST_COORDDIM() AS test_st_coorddim FROM dual;

```

返回结果如下：

```shell
+------------------+
| TEST_ST_COORDDIM |
+------------------+
|                2 |
+------------------+
1 row in set

```

### GET_GTYPE()

`GET_GTYPE()` 用于获取空间对象的几何类型代码。几何类型代码是一个整数值，表示特定类型的几何对象，例如点、线、多边形等。

**示例如下：**

```sql
SELECT SDO_GEOMETRY(2001, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,1), SDO_ORDINATE_ARRAY(10,500)).GET_GTYPE() AS test_get_gtype FROM dual;

```

返回结果如下：

```shell
+----------------+
| TEST_GET_GTYPE |
+----------------+
|              1 |
+----------------+
1 row in set

```

### ST_ISVALID()

`ST_ISVALID()` 用于检查空间对象是否是有效的几何对象。如果对象是有效的，函数将返回 1；否则，返回 0。

```sql
SELECT SDO_GEOMETRY(2001, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1,1), SDO_ORDINATE_ARRAY(10,500)).ST_ISVALID() AS test_st_isvalid FROM dual;

```

返回结果如下：

```shell
+-----------------+
| TEST_ST_ISVALID |
+-----------------+
|               1 |
+-----------------+
1 row in set

```

## `SDO_GEOM` 包

### SDO_DISTANCE()

`SDO_DISTANCE()` 用于计算两个空间几何对象之间的最小距离。例如二维参数 geom1 和二维参数 geom2 之间的最小距离。

```sql
SELECT SDO_GEOM.SDO_DISTANCE(SDO_GEOMETRY('POINT(0 0)', 4326), SDO_GEOMETRY('POINT(0.01 0)', 4326)) FROM dual;

```

返回结果如下：

```shell
+-----------------------------------------------------------------------------------------+
| SDO_GEOM.SDO_DISTANCE(SDO_GEOMETRY('POINT(00)', 4326),SDO_GEOMETRY('POINT(0.010)',4326)) |
+-----------------------------------------------------------------------------------------+
|                                                                      1113.1949077920626 |
+-----------------------------------------------------------------------------------------+
1 row in set

```

## 其他空间函数

### SDO_RELATE()

`SDO_RELATE()` 用于确定对象是否符合指定空间关系。

注意事项如下：

- 空间关系运算目前仅支持 `ANYINTERACT`。
 - 如果参数 `geom1` 和 `geom2` 基于不同的坐标系，`geom2` 则会报错。
 - 当用作索引查询时，`SDO_RELATE()` 必须在 `WHERE` 子句中使用 `SDO_RELATE(geometry1, geometry2, 'mask = <some_mask_val>') = 'TRUE'` 形式的函数表达式，且 `geometry1` 必须是索引列。

索引查询示例如下：

```sql
-- 创建测试表 test_spatial_index
CREATE TABLE test_spatial_index  (fid INTEGER NOT NULL PRIMARY KEY, g SDO_GEOMETRY NOT NULL SRID 4326 );

-- 插入几条测试数据
INSERT INTO test_spatial_index VALUES(1, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10 50, null), null, null));
INSERT INTO test_spatial_index VALUES(2, SDO_GEOMETRY(2001, 4326, null, SDO_ELEM_INFO_ARRAY (1,1,1), SDO_ORDINATE_ARRAY (10,50)));
INSERT INTO test_spatial_index VALUES(3, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234,50.567,null), null, null));
INSERT INTO test_spatial_index VALUES(4, SDO_GEOMETRY(2001, 4326, null, SDO_ELEM_INFO_ARRAY (1,1,1), SDO_ORDINATE_ARRAY (10.1234,50.567)));
INSERT INTO test_spatial_index VALUES(5, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234,50.567,null), null, null));

-- 创建空间索引 idx
CREATE INDEX idx ON test_spatial_index(g) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

-- 索引查询
SELECT * FROM test_spatial_index WHERE SDO_RELATE(g, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234,50.567,null), null, null), 'querytype=WINDOW mask=anyinteract') = 'TRUE';

```

返回结果如下：

```shell
+------+-----------------------------------------------------------------------------+
| FID  | G                                                                           |
+------+-----------------------------------------------------------------------------+
|    3 | SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234, 50.567, NULL), NULL, NULL) |
|    4 | SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234, 50.567, NULL), NULL, NULL) |
|    5 | SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(10.1234, 50.567, NULL), NULL, NULL) |
+------+-----------------------------------------------------------------------------+
3 rows in set

```

执行计划如下，使用了 idx 索引进行访问：

```sql
| |ID|OPERATOR       |NAME                     |EST.ROWS|EST.TIME(us)|                                                                                                    |
| --------------------------------------------------------------------                                                                                                    |
| |0 |TABLE FULL SCAN|TEST_SPATIAL_INDEX(IDX)|1       |135         |                                                                                                    |
| ====================================================================

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
