存储过程有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 :表示匿名块关闭
希望以上内容对您有所帮助,致以最诚挚的问候。
我知道为了将存储过程作为一个整体传递给服务器,我们需要声明一个新的分隔符,不允许 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 :表示匿名块关闭
希望以上内容对您有所帮助,致以最诚挚的问候。