- 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. 是否有与使用 mod_plsql 作为 Apache 上的网关直接与数据库中的存储过程通信的 MySQL 等效项?
- 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 存储过程和存储函数的文档? |
请参阅 第 27.2 节,“使用存储例程”。 | |
A.4.3. | 是否有关于 MySQL 存储过程的讨论论坛? |
A.4.4. | 在哪里可以找到存储过程的 ANSI SQL 2003 规范? |
遗憾的是,官方规范并非免费提供(ANSI 允许购买)。但是,有一些书籍,例如 Peter Gulutzan 和 Trudy Pelzer 合著的 SQL-99 Complete, Really,提供了对该标准的全面概述,包括对存储过程的介绍。 | |
A.4.5. | 如何管理存储例程? |
对存储例程使用清晰的命名方案始终是一种良好的做法。您可以使用 | |
A.4.6. | 是否有一种方法可以查看给定数据库中的所有存储过程和存储函数? |
是的。对于名为
有关更多信息,请参阅 第 28.3.30 节,“INFORMATION_SCHEMA ROUTINES 表”。 可以使用 | |
A.4.7. | 存储过程存储在哪里? |
存储过程存储在 您还可以使用 | |
A.4.8. | 是否可以将存储过程或存储函数分组到包中? |
否。MySQL 中不支持此功能。 | |
A.4.9. | 存储过程可以调用另一个存储过程吗? |
是的。 | |
A.4.10. | 存储过程可以调用触发器吗? |
存储过程可以执行 SQL 语句(例如 | |
A.4.11. | 存储过程可以访问表吗? |
是的。存储过程可以根据需要访问一个或多个表。 | |
A.4.12. | 存储过程是否有用于引发应用程序错误的语句? |
是的。MySQL 实现了 SQL 标准 | |
A.4.13. | 存储过程是否提供异常处理? |
MySQL 根据 SQL 标准实现了 | |
A.4.14. | MySQL 存储例程可以返回结果集吗? |
存储过程 可以,但存储函数不可以。如果您在存储过程中执行普通的 | |
A.4.15. | 存储过程是否支持 |
不支持。 | |
A.4.16. | MySQL 中是否有等效于使用 |
MySQL 中没有等效方法。 | |
A.4.17. | 我可以将数组作为输入传递给存储过程吗? |
不支持。 | |
A.4.18. | 我可以将游标作为 |
游标仅在存储过程中可用。 | |
A.4.19. | 我可以从存储过程中返回游标作为 |
游标仅在存储过程中可用。但是,如果您没有在 | |
A.4.20. | 我可以为了调试目的在存储例程中打印出变量的值吗? |
是的,您可以在 存储过程 中执行此操作,但不能在存储函数中执行。如果您在存储过程中执行普通的 | |
A.4.21. | 我可以在存储过程中提交或回滚事务吗? |
可以。但是,您不能在存储函数中执行事务性操作。 | |
A.4.22. | MySQL 存储过程和函数是否可以与复制一起使用? |
是的,在存储过程和函数中执行的标准操作会从复制源服务器复制到副本服务器。但也存在一些限制,这些限制在 第 27.8 节“存储程序二进制日志记录” 中有详细描述。 | |
A.4.23. | 在复制源服务器上创建的存储过程和函数是否会复制到副本服务器? |
是的,通过在复制源服务器上执行正常的 DDL 语句来创建的存储过程和函数会复制到副本服务器,以便这两个服务器上都存在这些对象。用于存储过程和函数的 | |
A.4.24. | 在存储过程和函数内部执行的操作是如何复制的? |
MySQL 会记录存储过程中发生的每个 DML 事件,并将这些单独的操作复制到副本服务器。对执行存储过程的实际调用不会被复制。 更改数据的存储函数将记录为函数调用,而不是记录为每个函数内部发生的 DML 事件。 | |
A.4.25. | 将存储过程和函数与复制一起使用是否有特殊的安全要求? |
是的。由于副本服务器有权执行从源服务器的二进制日志读取的任何语句,因此对将存储函数与复制一起使用存在特殊的安全限制。如果复制或二进制日志记录(用于时间点恢复)处于活动状态,则 MySQL DBA 可以选择以下两个安全选项
| |
A.4.26. | 复制存储过程和函数操作存在哪些限制? |
嵌入在存储过程中的非确定性(随机)或基于时间的操作可能无法正确复制。从本质上讲,随机生成的结果是不可预测的,也不能完全重现;因此,复制到副本服务器的随机操作不会镜像在源服务器上执行的操作。将存储函数声明为 此外,基于时间的操作无法在副本服务器上重现,因为存储过程中此类操作的计时无法通过用于复制的二进制日志重现。它只记录 DML 事件,而不考虑计时限制。 最后,对于在大型 DML 操作(例如批量插入)期间发生错误的非事务性表,可能会遇到复制问题,因为源服务器可能会从 DML 活动中部分更新,但由于发生的错误,副本服务器没有更新。解决方法是在执行函数的 DML 操作时使用 | |
A.4.27. | 上述限制是否会影响 MySQL 进行时间点恢复的能力? |
影响复制的限制也会影响时间点恢复。 | |
A.4.28. | 正在采取哪些措施来纠正上述限制? |
您可以选择基于语句的复制或基于行的复制。最初的复制实现是基于基于语句的二进制日志记录。基于行的二进制日志记录解决了前面提到的限制。
混合 复制也可用(通过使用 有关更多信息,请参阅 第 19.2.1 节“复制格式”。 |