Os procedimentos armazenados são instruções SQL definidas pelo usuário que são armazenadas em um banco de dados MySQL e executadas sob demanda para realizar uma operação de banco de dados específica. Essas sub-rotinas predefinidas ajudam a mover a lógica de negócios para o banco de dados, o que oferece alguns benefícios:
- As viagens de ida e volta feitas ao servidor de banco de dados por um aplicativo são minimizadas.
- A manutenção do código é aprimorada, pois diferentes aplicativos podem compartilhar o procedimento armazenado.
- O desempenho do banco de dados foi aprimorado, pois os procedimentos armazenados são compilados uma vez e executados com muita rapidez e eficiência.
Neste guia, você irá:
-
Aprenda a sintaxe para criar procedimentos armazenados e declare seu primeiro procedimento.
-
Execute o procedimento de exemplo depois de declará-lo.
-
Aprenda como excluir um procedimento quando não precisar mais dele.
Antes de começar
Certifique-se de ter o seguinte:
-
Se você ainda não o fez, crie uma conta Linode e Compute Instance. Veja nossos guias de Introdução ao Linode e Criação de uma instância de computação.
-
Siga nosso guia Configurando e protegendo uma instância de computação para atualizar seu sistema. Você também pode definir o fuso horário, configurar seu nome de host, criar uma conta de usuário limitada e proteger o acesso SSH.
-
Um servidor e cliente MySQL instalado no servidor Linode. Guias de instalação para MySQL estão disponíveis para diferentes distribuições em nossa seção MySQL.
Prepare o banco de dados
Você começará criando um banco de dados de amostra, uma tabela e um usuário para acessar o banco de dados. Você também preencherá a tabela com dados de amostra para fins de teste.
Criando o banco de dados, a tabela e o usuário
-
Faça login no servidor MySQL:
mysql -u root -p
Você será solicitado a inserir a senha de root do seu banco de dados MySQL. Em seguida, pressione Enter continuar.
-
Em seguida, você verá um prompt do MySQL semelhante ao mostrado abaixo.
mysql >
-
Digite o comando abaixo para criar umtest_db
base de dados:
CREATE DATABASE test_db;
Saída:
Query OK, 1 row affected (0.01 sec)
-
Crie um usuário de banco de dados e conceda acesso total aotest_db
base de dados. SubstituirPASSWORD
com um valor complexo e único que segue as diretrizes para senhas MySQL:
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Saída:
Query OK, 1 row affected (0.01 sec)
-
Conceda otest_user
privilégios totais para otest_db
base de dados;
GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Saída:
Query OK, 1 row affected (0.01 sec)
-
Privilégios de descarga:
FLUSH PRIVILEGES;
Saída:
Query OK, 0 rows affected (0.01 sec)
Preencher o banco de dados
-
Em seguida, mude para o banco de dados test_db:
USE test_db;
Saída:
Database changed
-
Crie umproducts
tabela para armazenar registros de amostra:
CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Saída:
Query OK, 0 rows affected (0.01 sec)
-
Agora você pode adicionar alguns produtos à tabela de produtos executando os comandos abaixo um por um:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
Você deve obter a saída abaixo após executar cadaInsert
demonstração:
Query OK, 1 row affected (0.00 sec)
-
Próximo. confirme se os produtos de amostra foram inseridos com sucesso no banco de dados executando oSelect
comando abaixo:
SELECT * FROM products;
Seus produtos de amostra devem ser listados conforme mostrado abaixo:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
Saia do servidor MySQL.
QUIT;
Saída:
Bye!
-
Depois de criar umtest_db
banco de dados,products
tabela, umtest_user
, e adicionou alguns produtos de amostra, agora você pode passar para a criação do primeiro procedimento armazenado.
Criando um procedimento armazenado
Sintaxe do procedimento armazenado
A sintaxe básica de criação de um procedimento armazenado no banco de dados MySQL é mostrada abaixo:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
ODELIMITER &&
A linha no início diz ao servidor MySQL para tratar as seguintes instruções SQL como uma única instrução, em vez de executá-las individualmente. Outro&&
é incluído em uma linha posterior para marcar o final desta declaração.
-
PROCEDURE_NAME
é onde o nome do seu procedimento armazenado é declarado.
-
O nome do procedimento é seguido por um conjunto de parênteses, e estes incluem os parâmetros do seu procedimento. Os procedimentos armazenados suportam parâmetros separados por vírgulas e esse recurso os torna mais flexíveis. Consulte a seção de parâmetros para obter mais detalhes.
-
OBEGIN...END
comandos incluem a instrução SQL que você deseja que seja executada pelo procedimento armazenado.
-
No final, a instruçãoDELIMITER ;
é emitido novamente para alterar o delimitador de volta para o valor padrão de;
Parâmetros de procedimento armazenado
Cada parâmetro de um procedimento tem um tipo, um nome e um tipo de dados, separados por espaços:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Por exemplo, para criar um parâmetro do tipo
IN
, chamado category
, com o VARCHAR
tipo de dados com comprimento de 50 caracteres, use esta sintaxe:IN category VARCHAR(50)
O MySQL suporta três tipos de parâmetros:
-
IN
:O valor do parâmetro deve ser especificado pelo cliente chamador. Este valor não pode ser alterado pelo procedimento armazenado .
Por exemplo, se você passar uma variável de sessão MySQL como umIN
parâmetro para um procedimento, e o procedimento modifica esse valor em suas instruções, sua variável de sessão permanecerá inalterada após o término do procedimento.
-
OUT
:esse tipo de parâmetro também é especificado pelo programa chamador, mas seu valor pode ser alterado pelo procedimento armazenado e recuperado pelo programa chamador.
Observe que o procedimento armazenado não pode acessar o valor inicial de uma variável que é passada como umOUT
parâmetro.
-
INOUT
:Um parâmetro deste tipo combina os comportamentos deIN
eOUT
parâmetros:
-
O procedimento armazenado pode ler o valor inicial do parâmetro.
-
O parâmetro pode ser alterado durante a execução do procedimento armazenado.
-
O valor alterado pode ser retornado ao programa de chamada, se o programa de chamada passou uma variável como parâmetro.
-
Um exemplo de procedimento armazenado
Depois de entender a sintaxe básica, vamos criar um procedimento armazenado simples para filtrar produtos por nome de categoria. O nome da categoria será fornecido como um
IN
parâmetro. -
Faça login no servidor MySQL usando otest_user
's credenciais que você criou ao preparar o banco de dados:
mysql -u test_user -p
-
Digite a senha dotest_user
e pressione Enter continuar.
-
Você receberá ummysql >
incitar. Prossiga selecionando otest_db
:
USE test_db;
Saída:
Database changed.
-
Em seguida, digite os comandos SQL abaixo para criar umfilter_by_category
procedimento armazenado:
DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Saída:
Query OK, 0 rows affected (0.00 sec)
-
Altere oDELIMITER
de volta para;
DELIMITER ;
-
Se o código para criar o procedimento armazenado foi executado com êxito, agora você pode prosseguir para a execução do procedimento armazenado.
Executando um procedimento armazenado
Nesta etapa, chamaremos o procedimento armazenado que criamos acima. Seguiremos esta sintaxe básica:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Para executar ofilter_by_category
procedimento armazenado que criamos acima, digite o comando abaixo:
CALL filter_by_category('COMPUTER ACCESSORIES');
O procedimento armazenado agora deve gerar todos os produtos emCOMPUTER ACCESSORIES
categoria porque especificamosCOMPUTER ACCESSORIES
como parâmetro:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
Da mesma forma, você pode recuperar uma lista de todos os produtos doELECTRONICS
categoria executando o comando abaixo.
CALL filter_by_category('ELECTRONICS') ;
Saída:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Nosso procedimento armazenado funcionou como esperávamos. A seguir, aprenderemos como descartar os procedimentos armazenados se não quisermos mais que eles sejam executados novamente.
Excluindo procedimentos armazenados
Você pode excluir um procedimento armazenado do MySQL se não quiser mais usá-lo ou se quiser recriá-lo do zero. A sintaxe básica de descartar o procedimento armazenado é mostrada abaixo:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Por exemplo, para excluir nosso
filter_by_category
procedimento armazenado, execute o comando MySQL abaixo:DROP PROCEDURE IF EXISTS filter_by_category;
Se o procedimento armazenado existir, você obterá a saída mostrada abaixo:
Query OK, 0 rows affected (0.00 sec)
Isso é tudo quando se trata de criar, usar e descartar procedimentos armazenados do MySQL.
Mais informações
Você pode querer consultar os seguintes recursos para obter informações adicionais sobre este tópico. Embora estes sejam fornecidos na esperança de que sejam úteis, observe que não podemos garantir a precisão ou pontualidade dos materiais hospedados externamente.
- Trabalhando com procedimentos armazenados do MySQL