• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 存储过程和函数

    A.4.1。

    MySQL 8.0是否支持存储过程和函数?

    是。MySQL 8.0支持两种类型的存储例程:存储过程和存储函数。

    A.4.2。

    在哪里可以找到有关MySQL存储过程和存储函数的文档?

    请参见“MySQL存储例程”。

    A.4.3。

    是否有MySQL存储过程的讨论区?

    是。见 https://forums.mysql.com/list.php?98。

    A.4.4。

    在哪里可以找到存储过程的ANSI SQL 2003规范?

    不幸的是,官方规范不是免费提供的(ANSI使它们可以购买)。但是,有一些书籍,例如Peter Gulutzan和Trudy Pelzer 撰写的《SQL-99 Complete》,《 Really》,提供了对该标准的全面概述,包括对存储过程的介绍。

    A.4.5。

    您如何管理存储的例程?

    对存储的例程使用明确的命名方案始终是一个好习惯。您可以管理存储与程序CREATE[FUNCTION|PROCEDURE]ALTER[FUNCTION|PROCEDURE]DROP[FUNCTION|PROCEDURE],和SHOW CREATE[FUNCTION|PROCEDURE]。您可以使用数据库中的ROUTINES表获取有关现有存储过程的INFORMATION_SCHEMA信息(请参见“ INFORMATION_SCHEMA ROUTINES表”)。

    A.4.6。

    有没有办法参见给定数据库中的所有存储过程和存储函数?

    是。对于名为的数据库dbname,请在INFORMATION_SCHEMA.ROUTINES表上使用以下查询:

    SELECT ROUTINE_TYPE, ROUTINE_NAME
        FROM INFORMATION_SCHEMA.ROUTINES
        WHERE ROUTINE_SCHEMA='dbname';
    

    有关更多信息,请参见“ INFORMATION_SCHEMA例程表”。

    可以使用SHOW CREATE FUNCTION(对于存储的函数)或SHOW CREATE PROCEDURE(对于存储的过程)参见存储例程的主体。有关更多信息,请参见“ SHOW CREATE PROCEDURE语句”。

    A.4.7。

    存储过程存储在哪里?

    存储过程存储在mysql.routinesmysql.parameters表中,它们是数据字典的一部分。您不能直接访问这些表。而是查询INFORMATION_SCHEMAROUTINESPARAMETERS表。请参见“ INFORMATION_SCHEMA例程表”和“ INFORMATION_SCHEMA参数表”。

    您还可以SHOW CREATE FUNCTION用于获取有关存储函数的信息,以及SHOW CREATE PROCEDURE获取有关存储过程的信息。请参见“ SHOW CREATE PROCEDURE语句”。

    A.4.8。

    是否可以将存储过程或存储函数分组到包中?

    不可以。MySQL8.0不支持此功能。

    A.4.9。

    一个存储过程可以调用另一个存储过程吗?

    是。

    A.4.10。

    存储过程可以调用触发器吗?

    存储过程可以执行UPDATE导致触发触发器的SQL语句(例如)。

    A.4.11。

    存储过程可以访问表吗?

    是。存储过程可以根据需要访问一个或多个表。

    A.4.12。

    存储过程是否有引发应用程序错误的语句?

    是。MySQL 8.0实现了SQL标准SIGNALRESIGNAL语句。请参见“条件处理”。

    A.4.13。

    存储过程是否提供异常处理?

    MySQL HANDLER根据SQL标准实现定义。有关详细信息,请参见“ DECLARE ... HANDLER语句”。

    A.4.14。

    MySQL 8.0存储例程可以返回结果集吗?

    存储过程可以,但存储函数不能。如果SELECT在存储过程内部执行普通操作,则结果集将直接返回给客户端。您需要使用MySQL 4.1(或更高版本)的客户端/服务器协议才能正常工作。这意味着,例如,在PHP中,您需要使用mysqli扩展名而不是旧的mysql扩展名。

    A.4.15。

    是否WITH RECOMPILE支持存储过程?

    不在MySQL 8.0中。

    A.4.16。

    是否有一个MySQL等同于mod_plsql用作Apache上的网关以直接与数据库中的存储过程对话?

    MySQL 8.0中没有等效功能。

    A.4.17。

    我可以将数组作为输入传递给存储过程吗?

    不在MySQL 8.0中。

    A.4.18。

    我可以将游标作为IN参数传递给存储过程吗?

    在MySQL 8.0中,游标仅在存储过程中可用。

    A.4.19。

    我可以OUT从存储过程中将游标作为参数返回吗?

    在MySQL 8.0中,游标仅在存储过程中可用。但是,如果未在上打开游标SELECT,则结果将直接发送到客户端。您也可以SELECT INTO变量。请参见“ SELECT语句”。

    A.4.20。

    我可以在存储的例程中打印出变量的值以进行调试吗?

    是的,您可以在存储过程中执行此操作,但不能在存储函数中执行此操作。如果SELECT在存储过程内部执行普通操作,则结果集将直接返回给客户端。您需要使用MySQL 4.1(或更高版本)的客户端/服务器协议才能正常工作。这意味着,例如,在PHP中,您需要使用mysqli扩展名而不是旧的mysql扩展名。

    A.4.21。

    我可以在存储过程中提交或回退事务吗?

    是。但是,您不能在存储的函数中执行事务操作。

    A.4.22。

    MySQL 8.0存储过程和函数可用于复制吗?

    是的,在存储过程和函数中执行的标准操作从MySQL主服务器复制到Slave服务器。“存储的程序二进制日志记录”中详细描述了一些限制。

    A.4.23。

    在主服务器上创建的存储过程和函数是否复制到从服务器上?

    是的,在主服务器上通过常规DDL语句执行的存储过程和函数的创建被复制到从服务器上,因此对象将在两个服务器上都存在。ALTERDROP存储过程和函数语句也被复制。

    A.4.24。

    如何复制在存储过程和函数内部进行的操作?

    MySQL记录存储过程中发生的每个DML事件,并将这些单独的动作复制到从属服务器。执行存储过程的实际调用不会被复制。

    更改数据的存储函数记录为函数调用,而不记录为每个函数内部发生的DML事件。

    A.4.25。

    使用存储过程和功能以及复制是否有特殊的安全要求?

    是。由于从属服务器有权执行从主控二进制日志中读取的任何语句,因此存在将安全功能与复制一起使用的特殊安全约束。如果通常复制或二进制日志记录(出于时间点恢复的目的)处于活动状态,则MySQL DBA可以使用两个安全选项:

    1. 任何希望创建存储功能的用户都必须被授予SUPER特权。
    2. 另外,DBA可以将log_bin_trust_function_creators系统变量设置为1,这使具有标准CREATE ROUTINE特权的任何人都可以创建存储的功能。

    A.4.26。

    复制存储过程和函数操作存在哪些限制?

    嵌入在存储过程中的不确定性(随机)或基于时间的操作可能无法正确复制。就其本质而言,随机产生的结果是不可预测的并且不能准确地再现,因此,复制到从属设备的随机操作将不会镜像在主设备上执行的操作。声明存储函数为DETERMINISTIC或将log_bin_trust_function_creators系统变量设置为0将不允许调用随机值操作。

    此外,基于时间的操作无法在从属服务器上重现,因为在存储过程中此类操作的时序无法通过用于复制的二进制日志进行重现。它仅记录DML事件,不考虑时序约束。

    最后,在大型DML操作(例如批量插入)期间发生错误的非事务处理表可能会遇到复制问题,因为可能会从DML活动中部分地更新主服务器,但是由于发生错误而不会对从服务器进行更新。一种解决方法是使用IGNORE关键字执行功能的DML操作,以便忽略引起错误的主服务器上的更新,并将不引起错误的更新复制到从属服务器上。

    A.4.27。

    前面的限制是否会影响MySQL进行时间点恢复的能力?

    影响复制的相同限制确实会影响时间点恢复。

    A.4.28。

    正在采取什么措施纠正上述限制?

    您可以选择基于语句的复制或基于行的复制。原始复制实现基于基于语句的二进制日志记录。基于行的二进制日志记录解决了前面提到的限制。

    也可以使用混合复制(通过使用启动服务器--binlog-format=mixed)。这种混合复制形式“知道”是否可以安全地使用语句级复制,还是需要行级复制。

    有关更多信息,请参见“复制格式”。


    上篇:服务器SQL模式

    下篇:触发器