存储过程有BEGIN和END为什么要指定分隔符?

Why specify delimiter for stored procedure when there's BEGIN and END?

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

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

通过查看这段代码,我注意到实际上有两个“事物”将我们的查询分组。它们是 BEGIN-END 关键字和 $$ delimeter。我的问题是为什么我们都需要它们,这不是多余的吗?

如果有人计划回答我们必须指定 BEGIN-END 因为存储过程的语法,他们将是错误的,因为它 不是强制性的 如果它包含单个查询:

create procedure another_procedure()
select * from table2;

谁能告诉我我在这里遗漏了什么?

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

If you use the mysql client program to define a stored program containing semicolon characters, a problem arises. By default, mysql itself recognizes the semicolon as a statement delimiter, so you must redefine the delimiter temporarily to cause mysql to pass the entire stored program definition to the server.

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

程序

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

语法:

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 ;

输入、输出和 input/output 参数

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

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

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

  • Input/Output : 是IN和OUT类型的组合。这些参数通过在参数名前加上保留字IN/OUT来表示。

匿名 PL/SQL 块

我们将从匿名块开始,其特点是它们没有名称并且通常从 PL/SQL.

创建和执行

我会详细解释每一个的作用:

  • DECLARE : 在此区域中,我们将声明我们将在 begin 中使用的变量。如果没有声明的变量,就不用放了。

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

  • END :表示匿名块关闭

希望以上内容对您有所帮助,致以最诚挚的问候。