# 入门

在本教程中，我们将逐步介绍如何使用`CREATE PROCEDURE`语句开发第一个MySQL存储过程。 另外，我们将向您展示如何从SQL语句调用存储过程。

## 编写第一个MySQL存储过程

我们将开发一个名为`GetAllProducts()`的简单[存储过程](http://www.yiibai.com/introduction-to-sql-stored-procedures.html)来帮助您熟悉创建存储过程的语法。 `GetAllProducts()`存储过程从`products`表中选择所有产品。

启动 *mysql* 客户端工具并键入以下命令：

```sql
DELIMITER //
 CREATE PROCEDURE GetAllProducts()
   BEGIN
   SELECT *  FROM products;
   END //
DELIMITER ;
```

让我们来详细地说明上述存储过程：

* 第一个命令是`DELIMITER //`，它与存储过程语法无关。 `DELIMITER`语句将标准分隔符 - 分号(`;`)更改为：`//`。 在这种情况下，分隔符从分号(`;`)更改为双斜杠`//`。为什么我们必须更改分隔符？ 因为我们想将存储过程作为整体传递给服务器，而不是让mysql工具一次解释每个语句。 在`END`关键字之后，使用分隔符`//`来指示存储过程的结束。 最后一个命令(`DELIMITER;`)将分隔符更改回分号(`;`)。
* 使用`CREATE PROCEDURE`语句创建一个新的存储过程。在`CREATE PROCEDURE`语句之后指定存储过程的名称。在这个示例中，存储过程的名称为：`GetAllProducts`，并把括号放在存储过程的名字之后。
* `BEGIN`和`END`之间的部分称为存储过程的主体。将声明性SQL语句放在主体中以处理业务逻辑。 在这个存储过程中，我们使用一个简单的[SELECT语句](http://www.yiibai.com/mysql/select-statement-query-data.html)来查询`products`表中的数据。

在mysql客户端工具中编写存储过程非常繁琐，特别是当存储过程复杂时。 大多数用于MySQL的GUI工具允许您通过直观的界面创建新的存储过程。

例如，在*MySQL Workbench*中，您可以如下创建一个新的存储过程：

**首先**，右键单击*Stored Procedures…*&#x5E76;选择“*Create Stored Procedure…*”菜单项。

![img](/files/-LyNv2i0XRHJO1DLz_jZ)

**接下来**，编写存储过程代码，然后单击*Apply*按钮

```sql
CREATE PROCEDURE `yiibaidb`.`GetAllProducts`()
BEGIN
    SELECT * FROM yiibaidb.products;
END
```

**然后**，您可以在MySQL将其存储在数据库中之前查看代码。如果一切都没有问题，点击*Apply*按钮。如下所示 -

![img](/files/-LyNv2i236oGqg11ICRt)

**之后**，MySQL将存储过程编译并放入数据库目录中; 单击*Fished*按钮完成。

![img](/files/-LyNv2i46zeffTDrDhMj)

最后，可以在`yiibaidb`数据库的例程下看到上面所创建的新存储过程。如下图所示 -

![img](http://www.yiibai.com/uploads/images/201707/3107/341110830_49828.png)

到此，我们已经成功地创建了一个存储过程。下面我们将学习如何使用它。

## 调用存储过程

要调用存储过程，可以使用以下SQL命令：

```sql
CALL STORED_PROCEDURE_NAME();
```

使用`CALL`语句调用存储过程，例如调用`GetAllProducts()`存储过程，则使用以下语句：

```sql
CALL GetAllProducts();
```

如果您执行上述语句，将查询获得`products`表中的所有产品。如下图所示 -

![img](/files/-LyNv2i6KuNyFguKybpO)

在本教程中，您已经学习了如何使用`CREATE PROCEDURE`语句编写一个简单的存储过程，并使用`CALL`语句从SQL语句中调用它。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hezhiqiang-book.gitbook.io/mysql/di-san-zhang/ru-men.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
