---
title: "PL 语法结构 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: PL 语法结构 存储程序的语法主要包括 BEGIN ... END 块、 DECLARE 声明和语句标签三个部分。 BEGIN ... END 块 BEGIN ... END 块支持复合语句，用于编写存储程序（存储过程、存储函数和触发器）。 BEGIN ... END 复合语句可以包含多个语句，并用 BEGIN 和 …
---
切换语言

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

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

# PL 语法结构

更新时间：2026-03-13 13:31:58

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/600.pl-reference/200.pl-mysql/100.basic-syntax-mysql.md)  

存储程序的语法主要包括 `BEGIN ... END` 块、`DECLARE` 声明和语句标签三个部分。

## BEGIN ... END 块

`BEGIN ... END` 块支持复合语句，用于编写存储程序（存储过程、存储函数和触发器）。

`BEGIN ... END` 复合语句可以包含多个语句，并用 `BEGIN` 和 `END` 关键字括起来。语法如下：

```sql
[begin_label:] BEGIN
    [statement_list]
END [end_label]

```

其中，`statement_list` 表示一个或多个语句的列表，每个语句以分号（;）结尾。`statement_list` 是可选的，因此空复合语句 `BEGIN END` 是合法的。

`BEGIN ... END` 块支持嵌套。`BEGIN ... END` 也可以被标记，详细信息请参考 **语句标签**。

PL 存储程序的默认分隔符为"/"，用户也可以使用 `delimiter` 命令自定义分隔符，以使整个定义能够作为单个语句传递给服务器。分隔符可以由单个字符或多个字符组成，应该避免使用反斜杠（\）字符，它一般会被用作转义字符。示例如下：

```sql
DELIMITER $$

DELIMITER //

```

#### 说明

使用 OceanBase 数据库开发时，一般需要自定义分隔符。如果 PL 块内部定义中不包含由 `;` 分隔的语句，则不需要使用分隔符。

## DECLARE 声明

`DECLARE` 语句用于定义程序的局部变量、异常处理和游标，详细信息请分别参见 [存储程序的变量](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004478378)、[异常处理](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004478361)和[游标](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004478365)。

`DECLARE` 仅允许在 `BEGIN ... END` 块内使用，并且必须在其开始的位置，即在其他语句的前面。

声明必须遵循如下使用顺序：

- 游标声明必须出现在异常处理程序声明之前。
 - 变量和条件声明必须出现在游标或异常处理程序声明之前。

## 语句标签

标签可用于 `BEGIN ... END` 块的 `LOOP`、`REPEAT` 和 `WHILE` 语句中。语法如下：

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

```

这些语句的标签遵循以下使用规则：

- `begin_label` 后面必须跟随一个冒号。
 - `begin_label` 可以在没有 `end_label` 的情况下给出。如果存在 `end_label`，则必须与 `begin_label` 相同。
 - 如果没有 `begin_label`，则无法给出 `end_label`。
 - 同一嵌套级别的标签必须是不同的。
 - 标签最长可达 16 个字符。

要引用已构造的标签，请使用 `ITERATE` 或 `LEAVE` 语句。以下示例为使用标签标记语句继续迭代或终止循环：

```sql
obclient> DELIMITER //

obclient> CREATE PROCEDURE doiterate()
    BEGIN
      DECLARE p1 INT DEFAULT 0;
      label1: LOOP
        SET p1 = p1 + 1;
        IF p1 < 10 THEN ITERATE label1; END IF;
        LEAVE label1;
      END LOOP label1;
    END //
Query OK, 0 rows affected

```

有关块内异常处理程序的声明，请参见 [DECLARE ... HANDLER](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004478356)。

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