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

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

通过查看这段代码,我注意到实际上有两个"东西"将我们的查询分组.它们分别是BEGIN-END$$ delimeter.我的问题是为什么我们两个都需要,这不是多余的吗?

如果有人打算回答,因为存储过程的语法,我们必须指定BEGIN-END,那么他们就错了,因为如果它包含一个查询,那么它就是not mandatory:

create procedure another_procedure()
select * from table2;

有人能告诉我我错过了什么吗?

推荐答案

Procedures

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

Syntax:

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

DELIMITER

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

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

Example :

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

DELIMITER $$

在本例中,我们再次配置分隔符为分号.

DELIMITER ;

Input, output and input/output parameters

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

  • Input :通过将保留字放在参数名称前面来表示它们.这些参数不能在过程中更改其值,也就是说,当过程结束时,这些参数的值将与进行过程调用时的值相同.在编程中,这相当于传递一个参数的值

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

  • Input/Output :它是输入和输出类型的组合.这些参数通过在参数名称前输入/输出保留字来表示.

Anonymous PL/SQL blocks

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

I will explain what each one does in detail :

  • DECLARE :在这个区域中,我们将声明我们将在begin中使用的变量.如果没有要声明的变量,就没有必要把它放进go .

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

  • END :表示匿名块关闭.

我希望这一切都对你有所帮助,祝你好运.

Mysql相关问答推荐

查找关联数据库表的超集

约会时的意外行为

数组上的MySQL、JSON_CONTAINS用法

Mysql - Select 匹配某些条件的两条记录之间经过的最大天数

如何从mysql中的不可用日期范围获取可用日期范围?

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

当mysql中只有一个索引列时,为什么使用范围条件锁定读取会锁定每条记录?

SQL使用LIMIT获取结果和结果中的行数

SQL / MySQL:如何在WHERE IN中判断类似于OR的AND逻辑

根据使用 mysql 的第一个过滤结果添加更多表行

Golang Gorm 没有创建带有约束的表

用两个新列制作表格,按偶数或奇数对另一列进行分类,并将一个类别中的所有偶数和奇数相加

MySQL:如何多次加入同一张表?

MySQL触发器在某些条件下防止INSERT

MySQL INSERT IF(自定义 if 语句)

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

在 MySQL 中检测 utf8 损坏的字符

Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL?

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

如何将 MySQL 查询结果存储在另一个表中?