A.4 MySQL 8.4 常见问题解答:存储过程和函数
- A.4.1. MySQL是否支持存储过程和函数?
- A.4.2. 在哪里可以找到MySQL存储过程和存储函数的文档?
- A.4.3. 是否有一个讨论论坛用于MySQL存储过程?
- A.4.4. 在哪里可以找到ANSI SQL 2003规范的存储过程?
- A.4.5. 如何管理存储例程?
- A.4.6. 是否有办法查看给定数据库中的所有存储过程和存储函数?
- A.4.7. 存储过程存储在哪里?
- A.4.8. 是否可以将存储过程或存储函数分组到包中?
- A.4.9. 存储过程可以调用另一个存储过程吗?
- A.4.10. 存储过程可以调用触发器吗?
- A.4.11. 存储过程可以访问表吗?
- A.4.12. 存储过程是否有语句来引发应用程序错误?
- A.4.13. 存储过程是否提供异常处理?
- A.4.14. MySQL存储例程可以返回结果集吗?
- A.4.15. 是否支持WITH RECOMPILE用于存储过程?
- A.4.16. 是否有一个MySQL等效于使用mod_plsql作为Apache上的网关,以直接与数据库中的存储过程通信?
- A.4.17. 我可以将数组作为输入传递给存储过程吗?
- A.4.18. 我可以将游标作为IN参数传递给存储过程吗?
- A.4.19. 我可以将游标作为OUT参数从存储过程返回吗?
- A.4.20. 我可以在存储例程中打印出变量的值用于调试目的吗?
- A.4.21. 我可以在存储过程中提交或回滚事务吗?
- A.4.22. MySQL存储过程和函数是否与复制一起工作?
- A.4.23. 在复制源服务器上创建的存储过程和函数是否被复制到副本?
- A.4.24. 存储过程和函数中的操作如何被复制?
- A.4.25. 使用存储过程和函数与复制一起时是否有特殊的安全要求?
- A.4.26. 存储过程和函数的复制有什么限制?
- A.4.27. 这些限制是否影响了MySQL的点时间恢复能力?
- A.4.28. 如何解决这些限制?
A.4.1. |
MySQL是否支持存储过程和函数? |
是的。 MySQL支持两种存储例程,存储过程和存储函数。 |
|
A.4.2. |
哪里可以找到MySQL存储过程和存储函数的文档? |
A.4.3. |
是否有一个讨论论坛用于MySQL存储过程? |
A.4.4. |
哪里可以找到ANSI SQL 2003规范的存储过程? |
不幸的是,官方规范不可免费获取(ANSI将其提供购买)。然而,有些书籍,如SQL-99 Complete, Really by Peter Gulutzan and Trudy Pelzer,提供了标准的综合概述,包括存储过程的覆盖。 |
|
A.4.5. |
如何管理存储例程? |
总是使用明确的命名方案为您的存储例程。您可以使用 |
|
A.4.6. |
是否有办法查看给定数据库中的所有存储过程和存储函数? |
是的。对于名为
更多信息,请见第28.3.30节,“INFORMATION_SCHEMA ROUTINES表”。 存储例程的主体可以使用 |
|
A.4.7. |
存储过程存储在哪里? |
存储过程存储在mysql.routines和mysql.parameters表中,这些表是数据字典的一部分。您不能直接访问这些表。相反,查询 您也可以使用 |
|
A.4.8. |
是否可以将存储过程或存储函数分组到包中? |
不支持。 |
|
A.4.9. |
存储过程可以调用另一个存储过程吗? |
是的。 |
|
A.4.10. |
存储过程可以调用触发器吗? |
存储过程可以执行SQL语句,如 |
|
A.4.11. |
存储过程可以访问表吗? |
是的。存储过程可以根据需要访问一个或多个表。 |
|
A.4.12. |
存储过程是否具有引发应用程序错误的语句? |
是的。 MySQL 实现了 SQL 标准 |
|
A.4.13. |
存储过程是否提供异常处理? |
MySQL 实现了 |
|
A.4.14. |
MySQL 存储例程是否可以返回结果集? |
存储过程 可以,但存储函数不能。如果您在存储过程中执行普通的 |
|
A.4.15. |
是否支持 |
否。 |
|
A.4.16. |
是否有 MySQL 等效于使用 |
没有等效项。 |
|
A.4.17. |
是否可以将数组作为输入传递给存储过程? |
否。 |
|
A.4.18. |
是否可以将游标作为 |
游标只能在存储过程中使用。 |
|
A.4.19. |
是否可以将游标作为 |
游标只能在存储过程中使用。然而,如果您不打开游标来执行 |
|
A.4.20. |
是否可以在存储例程中打印变量的值以进行调试? |
是的,您可以在 存储过程 中这样做,但不能在存储函数中。如果您在存储过程中执行普通的 |
|
A.4.21. |
是否可以在存储过程中提交或回滚事务? |
是的。然而,您不能在存储函数中执行事务操作。 |
|
A.4.22. |
MySQL 存储过程和函数是否与复制兼容? |
是的,标准操作在存储过程和函数中执行,这些操作将从复制源服务器复制到副本服务器。有一些限制,这些限制在 第 27.7 节,“存储程序二进制日志记录” 中有详细描述。 |
|
A.4.23. |
是否将存储过程和函数从复制源服务器复制到副本服务器? |
是的,通过普通 DDL 语句在复制源服务器上创建的存储过程和函数将被复制到副本服务器,以便这些对象在两个服务器上都存在。 |
|
A.4.24. |
存储过程和函数中的操作如何被复制? |
MySQL 记录了在存储过程中发生的每个 DML 事件,并将这些单个操作复制到副本服务器。实际调用存储过程的语句不会被复制。 更改数据的存储函数将被记录为函数调用,而不是在每个函数内部发生的 DML 事件。 |
|
A.4.25. |
使用存储过程和函数与复制时是否有特殊的安全要求? |
是的。因为副本服务器有权执行从源服务器的二进制日志中读取的任何语句,因此使用存储函数与复制时存在特殊的安全约束。如果复制或二进制日志记录(用于点时间恢复)处于活动状态,那么 MySQL DBA 有两个安全选项开放给他们:
|
|
A.4.26. |
复制存储过程和函数操作时存在哪些限制? |
非确定性(随机)或基于时间的操作嵌入存储过程可能无法正确复制。由于随机产生的结果不可预测,因此无法在副本上精确地重现随机操作。将存储函数声明为 此外,基于时间的操作也不能在副本上重现,因为存储过程中的时间约束无法通过用于复制的二进制日志记录。 最后,对于大型 DML 操作(例如批量插入)出现错误的非事务表可能会遇到复制问题,因为源可能会部分更新,而副本不会更新,因为错误会阻止更新。解决方法是使用 |
|
A.4.27. |
前面的限制是否会影响 MySQL 的点时恢复能力? |
影响复制的限制也会影响点时恢复。 |
|
A.4.28. |
正在采取什么措施来纠正前面的限制? |
您可以选择基于语句的复制或基于行的复制。原始复制实现基于基于语句的二进制日志记录。基于行的二进制日志记录解决了前面提到的限制。 混合 复制也可用(通过使用 有关更多信息,请参阅 第 19.2.1 节,“复制格式”。 |