---
title: "CREATE FORMAT OUTLINE - OceanBase 数据库 V4.2.2 | OceanBase 文档中心"
description: CREATE FORMAT OUTLINE 描述 该语句用来创建模糊 Outline。可以通过两种方式创建模糊 Outline，一种是通过 SQL_TEXT （用户执行的带参数的原始语句），另一种是通过 SQL_ID 创建。 注意 创建 Outline 需要进入对应的用户下执行。 使用限制与注意事项 当 SQL_ID…
---
切换语言

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

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

# CREATE FORMAT OUTLINE

更新时间：2026-04-10 11:58:36

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.2/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/2350.create-format-outline-of-mysql-mode.md)  

## 描述

该语句用来创建模糊 Outline。可以通过两种方式创建模糊 Outline，一种是通过 `SQL_TEXT`（用户执行的带参数的原始语句），另一种是通过 `SQL_ID` 创建。

#### 注意

创建 Outline 需要进入对应的用户下执行。

## 使用限制与注意事项

当 `SQL_ID` 相同时，使用 `SQL_TEXT` 方式创建的 Outline 会覆盖 `SQL_ID` 方式创建的 Outline，`SQL_TEXT` 方式创建的优先级更高。

此外，OceanBase 数据库通过 `SQL_ID` 区分不同的 SQL，而 `SQL_ID` 是通过 `SQL_TEXT` 取 `MD5` 加密得到的，相同的 SQL 文本即使多一个换行或制表符，`MD5` 得到的 `SQL_ID` 都会不同。在实际生产系统中，推荐通过 `SQL_ID` 进行 Outline 绑定。

## 语法

```sql
/* 使用 SQL_TEXT 创建 Outline */
CREATE [OR REPLACE] FORMAT OUTLINE outline_name ON format_stmt [ TO format_target_stmt ]

/* 使用 SQL_ID 创建 Outline */
CREATE [OR REPLACE] FORMAT OUTLINE outline_name ON format_sql_id USING HINT hint;

```

## 参数解释

| 参数 | 描述 |
| --- | --- |
| outline_name | 指定要创建的模糊 Outline 名称。 |
| OR REPLACE | 如果指定 `OR REPLACE`，并且要创建的 Outline 已存在，则替换原有的 Outline。 |
| format_stmt | 表示原始 SQL 经过一系列规则的改写后得到的 format_stmt。通常，这种 stmt 可以通过一些表达式或 DBMS 包获取。 |
| TO format_target_stmt | 与 `format_stmt` 获取方式相同，但需要注意，如果期望对含有 `HINT` 的语句进行固定计划，则应使用 `format_target_stmt` 指明原始 SQL。在使用 TO `format_target_stmt` 子句时，要求原始 SQL `format_stmt` 与 `format_target_stmt` 在去掉 `HINT` 后完全匹配。 |
| format_sql_id | 需要绑定的 SQL 对应的经过一系列规则改写后得到的 `format_stmt`，然后根据 `format_stmt` 计算 `MD5` 值得到的 `format_sql_id`。 |

## 示例

创建一个 `employees` 表，并插入数据：

```sql
-- 创建表
CREATE TABLE employees (
    employee_id INT,
    employee_name VARCHAR(50),
    department_id INT
);

-- 插入数据
INSERT INTO employees (employee_id, employee_name, department_id) VALUES
    (1, 'John', 10),
    (2, 'Jane', 20),
    (3, 'Doe', 10),
    (4, 'Alice', 20),
    (5, 'Bob', 30);

```

### 使用 `SQL_TEXT` 创建 Outline 的示例：

```sql
-- 创建 Outline
CREATE FORMAT OUTLINE my_outline ON 'SELECT * FROM employees WHERE department_id = ?';

-- 使用 Outline
SELECT /*+ my_outline */ * FROM employees WHERE department_id = 20;

```

在这个示例中，通过 `CREATE FORMAT OUTLINE` 使用 `SQL_TEXT` 创建了一个 Outline，然后在实际的 SQL 语句中通过注释 `/*+ my_outline */` 使用了这个 Outline。

返回结果如下：

```shell
+-------------+---------------+---------------+
| employee_id | employee_name | department_id |
+-------------+---------------+---------------+
|           2 | Jane          |            20 |
|           4 | Alice         |            20 |
+-------------+---------------+---------------+
2 rows in set

```

### 使用 `SQL_ID` 创建 Outline 的示例：

```sql
-- 获取 SQL_ID
SELECT SQL_ID FROM v$sql WHERE sql_text = 'SELECT * FROM employees WHERE department_id = ?';

-- 创建 Outline
CREATE FORMAT OUTLINE my_sql_id_outline ON SQL_ID 'b5mgha4x5gs1j';

-- 使用 Outline
SELECT /*+ my_sql_id_outline */ * FROM employees WHERE department_id = 10;

```

在这个示例中，首先通过查询 `v$sql` 视图获取了 SQL 语句的 `SQL_ID`，然后通过 `CREATE FORMAT OUTLINE` 使用 `SQL_ID` 创建了一个 Outline，并在实际的 SQL 语句中通过注释 `/*+ my_sql_id_outline */` 使用了这个 Outline。

返回结果如下所示：

```shell
+-------------+---------------+---------------+
| employee_id | employee_name | department_id |
+-------------+---------------+---------------+
|           1 | John          |            10 |
|           3 | Doe           |            10 |
+-------------+---------------+---------------+
2 rows in set

```

 上一篇 下一篇 ![有帮助](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) 咨询热线
