MySQL --- Explicação detalhada dos procedimentos armazenados

Introdução aos procedimentos armazenados

Por que usar procedimentos armazenados?

A versão 5.0 do MySQL passou a oferecer suporte a procedimentos armazenados.

A maioria das instruções SQL são instruções únicas em uma ou mais tabelas. Nem todas as operações são tão simples. Freqüentemente, uma operação completa requer várias instruções para ser concluída.

Simplificando, um procedimento armazenado é uma coleção de uma ou mais instruções MySQL que são salvas para uso posterior. Pense nisso como um arquivo em lote. Embora sua função não se limite ao processamento em lote.

O procedimento armazenado é muito simples em pensamento, ou seja, encapsulamento de código e reutilização no nível da linguagem SQL do banco de dados.

Vantagens de procedimentos armazenados

  1. Simplifique operações complexas encapsulando o processamento em unidades fáceis de usar;
  2. Simplifique o gerenciamento de mudanças. Se o nome da tabela, o nome da coluna ou a lógica de negócios forem alterados. Basta alterar o código do procedimento armazenado, as pessoas que o utilizam não alterarão o seu próprio código;
  3. Normalmente, os procedimentos armazenados ajudam a melhorar o desempenho do aplicativo. Quando o procedimento armazenado criado é compilado, ele é armazenado no banco de dados. No entanto, os procedimentos armazenados implementados pelo MySQL são ligeiramente diferentes. Os procedimentos armazenados do MySQL são compilados sob demanda. Após compilar o procedimento armazenado, o MySQL o coloca no cache. O MySQL mantém seu próprio cache de procedimento armazenado para cada conexão. Se o aplicativo usar o procedimento armazenado várias vezes em uma única conexão, use a versão compilada, caso contrário, o procedimento armazenado funcionará como uma consulta;
  4. Os procedimentos armazenados ajudam a reduzir o tráfego entre o aplicativo e o servidor de banco de dados, porque o aplicativo não precisa enviar várias instruções SQL longas, mas apenas o nome e os parâmetros do procedimento armazenado;
  5. O programa armazenado é reutilizável e transparente para qualquer aplicativo. O procedimento armazenado expõe a interface do banco de dados a todos os aplicativos, para que os desenvolvedores não precisem desenvolver as funções com suporte no procedimento armazenado;
  6. O programa armazenado é seguro. Os administradores de banco de dados podem conceder permissões apropriadas a aplicativos que acessam procedimentos armazenados no banco de dados sem fornecer nenhuma permissão às tabelas de banco de dados subjacentes.

Desvantagens dos procedimentos armazenados

  1. Se um grande número de procedimentos armazenados for usado, o uso de memória de cada conexão que usa esses procedimentos armazenados aumentará muito. Além disso, se você usar demais um grande número de operações lógicas no processo de armazenamento, o uso da CPU também aumentará, porque o design inicial do banco de dados MySQL se concentra em consultas eficientes, o que não conduz a operações lógicas;
  2. A estrutura de procedimentos armazenados torna mais difícil desenvolver procedimentos armazenados com lógica de negócios complexa;
  3. É difícil depurar procedimentos armazenados. Apenas alguns sistemas de gerenciamento de banco de dados permitem depurar procedimentos armazenados. Infelizmente, o MySQL não fornece a capacidade de depurar procedimentos armazenados;
  4. Não é fácil desenvolver e manter procedimentos armazenados. O desenvolvimento e a manutenção de procedimentos armazenados geralmente requerem uma habilidade profissional que nem todos os desenvolvedores de aplicativos possuem. Isso pode causar problemas na fase de desenvolvimento e manutenção do aplicativo.

Procedimentos armazenados em MySQL

Criar e chamar procedimentos

Crie um procedimento armazenado, o código é o seguinte:

-- 创建存储过程 
create procedure mypro(in a int,in b int,out sum int) 
begin 
set sum = a+b; 
end;

Os resultados são os seguintes

image-20210316103451673

Você também pode visualizar o processo no nó "Função" do cliente Navicat, conforme mostrado na figura abaixo:

imagem-20210316103523273

Chame o procedimento armazenado, o código é o seguinte:

call mypro(1,2,@s);-- 调用存储过程 
select @s;-- 显示过程输出结果

resultado da operação

imagem-20210316103610471

Análise de sintaxe de procedimento armazenado

  • create procedure Usado para criar o processo;
  • mypro Usado para definir o nome do processo;
  • (in a int,in b int,out sum int)Parâmetro representa o processo no qual indenota um parâmetro de entrada, outindica um parâmetro de saída. Semelhante aos parâmetros formais e valor de retorno quando Java define um método;
  • beginE endrepresenta o início e o fim do corpo principal do processo, o que equivale a um par de chaves em um método de definição Java;
  • callUsada para chamar o processo, @sé a variável usada para receber os parâmetros de saída do processo

Parâmetros do procedimento armazenado

Os parâmetros do procedimento armazenado do MySQL são usados ​​na definição do procedimento armazenado. Existem três tipos de parâmetros:

  • IN Parâmetro de entrada: indica que o chamador passa um valor para o procedimento (o valor de entrada pode ser um literal ou variável);
  • OUT Parâmetro de saída: indica que o processo envia um valor ao chamador (vários valores podem ser retornados) (o valor de saída só pode ser uma variável);
  • INOUTParâmetros de entrada e saída: não significa apenas que o chamador passa um valor para o processo, mas também significa que o processo passa um valor para o chamador (os valores só podem ser variáveis).

Os procedimentos armazenados podem ser divididos em quatro categorias de acordo com os parâmetros:

1) Processo sem parâmetros;

2) .Somente o processo de entrada de parâmetros;

3). Apenas o processo de parâmetros de saída;

4) Processo incluindo parâmetros de entrada e saída.

variável

O procedimento armazenado no MySQL é semelhante ao método em java.

Nesse caso, as variáveis ​​também podem ser usadas em procedimentos armazenados. O escopo da variável local em java é o método onde a variável está localizada, e o escopo da variável local no MySQL é o procedimento armazenado onde ela está localizada.

Definições de variáveis

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
  • declareUsado para declarar variáveis;

  • variable_nameRepresenta o nome da variável;

  • datatypeÉ o tipo de dados do MySQL;

  • defaultUsado para declarar valores padrão;

  • Por exemplo:

    declare name varchar(20) default ‘jack’。
    

Atribuição de variável

SET 变量名 = 表达式值 [,variable_name = expression ...]

Use variáveis ​​no procedimento armazenado, o código é o seguinte

use schooldb;-- 使用 schooldb 数据库
-- 创建过程
create procedure mypro1()
begin
declare name varchar(20);
set name = '丘处机';
select * from studentinfo where studentname = name;
end;
-- 调用过程
call mypro1();

resultado da operação

image-20210316104419334

Declaração de controle de fluxo

se declaração condicional

IFA declaração contém vários julgamentos condicionais. De acordo com o resultado TRUE, FALSEa declaração é executada if, else ifque é elsesemelhante à sintaxe de ,, e em linguagens de programação .

Defina um procedimento armazenado, insira um número inteiro e use a instrução if para determinar se é positivo ou negativo. O código é o seguinte:

-- 创建过程
create procedure mypro2(in num int)
begin
if num<0 then -- 条件开始
select '负数';
elseif num=0 then
select '不是正数也不是负数';
else
select '正数';
end if;-- 条件结束
end;
-- 调用过程
call mypro2(-1);

resultado da operação

imagem-20210316104810016

declaração condicional de caso

caseÉ uma outra instrução condicional, similar à linguagem de programação choose, whensintaxe. Na caseinstrução MySQL tem dois
formatos de sintaxe .

Defina um procedimento armazenado, insira um número inteiro e use a instrução case para determinar se é positivo ou negativo. O código é o seguinte:

-- 创建过程
create procedure mypro3(in num int)
begin
case -- 条件开始
when num<0 then select '负数';
when num=0 then select '不是正数也不是负数';
else select '正数';
end case; -- 条件结束
end;
-- 调用过程
call mypro3(1);

resultado da operação

imagem-20210316104934579

Defina um procedimento armazenado, insira um número inteiro e use a instrução case para determinar se é 1 ou 2. O código é o seguinte:

-- 创建过程
create procedure mypro4(in num int)
begin
case num -- 条件开始
when 1 then select '数值是 1';
when 2 then select '数值是 2';
else select '不是 1 也不是 2';
end case; -- 条件结束
end;
-- 调用过程
call mypro4(3);

resultado da operação

image-20210316105009743

Ambas as gramáticas de caso podem alcançar julgamento condicional, mas a primeira é adequada para julgamento de valor de intervalo e a segunda é adequada para julgamento de valor definido.

instrução while loop

whileDeclaração de uso e javaem whileum ciclo semelhante.

Defina um procedimento armazenado e use um loop while para gerar a soma cumulativa de 1 a 10. O código é o seguinte:

-- 创建过程
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do -- 循环开始
set num = num+1;
set sum = sum+num;
end while; -- 循环结束
end;
-- 调用过程
call mypro5(@sum);
-- 查询变量值
select @sum;

resultado da operação

imagem-20210316105127457

repetir instrução de loop

repeatUso e instruções javana do…whileinstrução, as operações são o primeiro ciclo de execução, então a condição de determinação, a diferença entre repeata expressão da
fórmula é falseapenas executado loops até que o valor da expressão trueseja interrompido.

Defina um procedimento armazenado e use um loop de repetição para gerar a soma cumulativa de 1 a 10. O código é o seguinte:

-- 创建过程
create procedure mypro6(out sum int)
begin
declare num int default 0;
set sum = 0;
repeat-- 循环开始
set num = num+1;
set sum = sum+num;
until num>=10
end repeat; -- 循环结束
end;
-- 调用过程
call mypro6(@sum);
-- 查询变量值
select @sum;

resultado da operação

image-20210316105241308

declaração de loop

As instruções de loop são usadas para executar certas instruções repetidamente.

Pode ser usado durante a leaveinstrução de execução ou iteratefora do loop pode ser aninhado IFcomo uma instrução de julgamento.

  • leaveO efeito da instrução é equivalente ao de java, breakque é usado para encerrar o loop;
  • iterateO efeito da instrução é equivalente ao de java, continueque é usado para encerrar esta operação de loop e entrar no próximo loop.

Defina um procedimento armazenado e use o loop para gerar a soma cumulativa de 1 a 10. O código é o seguinte:

-- 创建过程
create procedure mypro7(out sum int)
begin
declare num int default 0;
set sum = 0;
loop_sum:loop-- 循环开始
set num = num+1;
set sum = sum+num;
if num>=10 then
leave loop_sum;
end if;
end loop loop_sum; -- 循环结束
end;
-- 调用过程
call mypro7(@sum);
-- 查询变量值
select @sum;

resultado da operação

imagem-20210316105416021

O loop_sum no código é equivalente a rotular o loop para facilitar a operação flexível durante vários loops.

Gerenciamento de procedimentos armazenados

O gerenciamento do processo de armazenamento inclui principalmente: exibir o processo, exibir o código-fonte do processo e excluir o processo.

A forma mais simples é utilizar a ferramenta cliente Navicat para gerenciamento, basta clicar com o mouse, conforme mostrado na figura abaixo:

imagem-20210316105545505

Mostrar procedimento armazenado

SHOW PROCEDURE STATUS;

Exibir os procedimentos armazenados de um banco de dados específico

SHOW PROCEDURE status where db = 'schooldb';

Para exibir procedimentos armazenados em um modo específico, é necessário exibir procedimentos armazenados com "meu" no nome

SHOW PROCEDURE status where name like '%my%';

Exibir o código-fonte do procedimento armazenado "mypro1"

SHOW CREATE PROCEDURE mypro1;

imagem-20210316105740141

Exclua o procedimento armazenado "mypro1"

drop PROCEDURE mypro1;

Acho que você gosta

Origin blog.csdn.net/whf_a/article/details/114871866
Recomendado
Clasificación