Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criando e usando procedimentos armazenados do MySQL - um tutorial


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:

  1. 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.

  2. 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.

  3. 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


  1. 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.

  2. Em seguida, você verá um prompt do MySQL semelhante ao mostrado abaixo.
    mysql >

  3. Digite o comando abaixo para criar um test_db base de dados:
    CREATE DATABASE test_db;
    

    Saída:
    Query OK, 1 row affected (0.01 sec)

  4. Crie um usuário de banco de dados e conceda acesso total ao test_db base de dados. Substituir PASSWORD 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)

  5. Conceda o test_user privilégios totais para o test_db base de dados;
    GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
    

    Saída:
    Query OK, 1 row affected (0.01 sec)

  6. Privilégios de descarga:
    FLUSH PRIVILEGES;
    

    Saída:
    Query OK, 0 rows affected (0.01 sec)

Preencher o banco de dados


  1. Em seguida, mude para o banco de dados test_db:
    USE test_db;
    

    Saída:
    Database changed

  2. Crie um products 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)

  3. 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 cada Insert demonstração:
    Query OK, 1 row affected (0.00 sec)

  4. Próximo. confirme se os produtos de amostra foram inseridos com sucesso no banco de dados executando o Select 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)

  5. Saia do servidor MySQL.
    QUIT;
    

    Saída:
    Bye!

  6. Depois de criar um test_db banco de dados, products tabela, um test_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 ;

  • O DELIMITER && 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.

  • O BEGIN...END comandos incluem a instrução SQL que você deseja que seja executada pelo procedimento armazenado.

  • No final, a instrução DELIMITER ; é 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 um IN 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 um OUT parâmetro.

  • INOUT :Um parâmetro deste tipo combina os comportamentos de IN e OUT 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.

  1. Faça login no servidor MySQL usando o test_user 's credenciais que você criou ao preparar o banco de dados:
     mysql -u test_user -p
    

  2. Digite a senha do test_user e pressione Enter continuar.

  3. Você receberá um mysql > incitar. Prossiga selecionando o test_db :
     USE test_db;
    

    Saída:
    Database changed.

  4. Em seguida, digite os comandos SQL abaixo para criar um filter_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)

  5. Altere o DELIMITER de volta para ;
    DELIMITER ;
    

  6. 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 o filter_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 em COMPUTER ACCESSORIES categoria porque especificamos COMPUTER 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 do ELECTRONICS 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