【问题标题】:Why specify delimiter for stored procedure when there's BEGIN and END?为什么在有 BEGIN 和 END 时为存储过程指定分隔符?
【发布时间】:2022-08-07 23:58:46
【问题描述】:

我知道为了将存储过程作为一个整体传递给服务器,我们需要声明一个新的分隔符,它不允许 MySQL 一次解释一个语句。

所以,我们的存储过程看起来像这样:

delimiter $$
create procedure some_procedure()
begin
insert into table1 select * from table2;
select * from table1;
end $$
delimiter ;

通过查看这段代码,我注意到实际上有两个“事物”对我们的查询进行分组。他们是开始-结束关键字和$$ 分隔符.我的问题是为什么我们都需要它们,这不是多余的吗?

如果有人计划回答我们必须指定开始-结束由于存储过程的语法,它们本来就是错误的不是强制性的如果它包含一个查询:

create procedure another_procedure()
select * from table2;

有人可以告诉我我在这里想念什么吗?

  • Here 是带有示例的简短描述,用于描述为什么在 Mariadb 中使用分隔符,但 mysql 应该以相同的方式工作。

标签: mysql stored-procedures


【解决方案1】:

程序

存储过程是一组与数据库关联存储的 SQL 语句。它是一个使用创建过程声明并使用调用语句.一个过程可以有零个或多个输入参数以及零个或多个输出参数。

句法:

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
    Valid SQL routine statement

分隔符

要定义存储过程,需要临时修改用于分隔 SQL 语句的分隔符。

SQL 中使用的默认分隔符是分号 (;)。在我们将要执行的示例中,我们将使用字符 $$ 来分隔 SQL 语句,但也可以使用任何其他字符。

例子 :

在此示例中,我们将 $$ 字符设置为 SQL 语句之间的分隔符。

DELIMITER $$

在此示例中,我们再次配置分隔符为分号。

DELIMITER ;

输入、输出和输入/输出参数

在存储过程中,我们可以有三种类型的参数:

  • 输入 :它们通过在参数名称前面放置保留字 IN 来表示。这些参数不能在过程中改变它们的值,也就是说,当过程结束时,这些参数将具有与进行过程调用时相同的值。在编程中,它相当于通过参数的值传递

  • 输出 :它们通过在参数名称前面放置保留字 OUT 来表示。这些参数在过程中改变它们的值。当进行过程调用时,它们以初始值开始,当过程执行结束时,它们可以以不同的值结束。在编程中,它相当于通过引用传递参数。

  • 输入输出 :它是 IN 和 OUT 类型的组合。这些参数通过在参数名称前放置保留字 IN/OUT 来表示。

匿名 PL/SQL 块

我们将从匿名块开始,其特点是它们没有名称,通常由 PL/SQL 创建和执行。

我将详细解释每个人的作用:

  • 宣布 :在这个区域中,我们将声明我们将在 begin 中使用的变量。如果没有要声明的变量,就不用放了。

  • 开始 :该区域包含要执行的 PL/SQL 代码。

  • 结尾 :表示匿名块的关闭。

我希望这一切对你有所帮助,最好的问候。

【讨论】:

  • 感谢您的精彩解释。我想补充的一件事是,当与 DELIMITER 结合使用时,可能会有更多的 BEGIN-END 块给我们提供更大的灵活性。
【解决方案2】:

在文档中,25.1 Defining Stored Programs 它说:

如果使用mysql客户端程序定义存储程序 包含分号字符,就会出现问题。默认情况下,mysql 本身将分号识别为语句分隔符,因此您必须 临时重新定义分隔符,使mysql通过整个 将程序定义存储到服务器。

因此,分号始终(包括在 BEGIN/END 块内使用时)被视为语句分隔符。

【讨论】:

  • 第一句话很重要 - 您不必在所有情况下都设置分隔符..并且 OP 尚未定义创建此 sp 的位置..
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多