diff --git a/content/posts/sql-structured-query-language-2/assets/Aula_02-Visao.pdf b/content/posts/sql-structured-query-language-2/assets/Aula_02-Visao.pdf new file mode 100644 index 00000000..cccce682 Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/Aula_02-Visao.pdf differ diff --git a/content/posts/sql-structured-query-language-2/assets/Aula_03-Procedures.pdf b/content/posts/sql-structured-query-language-2/assets/Aula_03-Procedures.pdf new file mode 100644 index 00000000..6a4b36ab Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/Aula_03-Procedures.pdf differ diff --git a/content/posts/sql-structured-query-language-2/assets/cliente-banco-dark.png b/content/posts/sql-structured-query-language-2/assets/cliente-banco-dark.png new file mode 100644 index 00000000..9da4fca3 Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/cliente-banco-dark.png differ diff --git a/content/posts/sql-structured-query-language-2/assets/cliente-banco-light.png b/content/posts/sql-structured-query-language-2/assets/cliente-banco-light.png new file mode 100644 index 00000000..8115fd46 Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/cliente-banco-light.png differ diff --git a/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-dark.png b/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-dark.png new file mode 100644 index 00000000..297e9702 Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-dark.png differ diff --git a/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-light.png b/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-light.png new file mode 100644 index 00000000..d172eb7a Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/confirmar-pedido-light.png differ diff --git a/content/posts/sql-structured-query-language-2/assets/fluxo-api-dark.png b/content/posts/sql-structured-query-language-2/assets/fluxo-api-dark.png new file mode 100644 index 00000000..f43633fb Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/fluxo-api-dark.png differ diff --git a/content/posts/sql-structured-query-language-2/assets/fluxo-api-light.png b/content/posts/sql-structured-query-language-2/assets/fluxo-api-light.png new file mode 100644 index 00000000..b8897fad Binary files /dev/null and b/content/posts/sql-structured-query-language-2/assets/fluxo-api-light.png differ diff --git a/content/posts/sql-structured-query-language-2/sql-structured-query-language-2.mdx b/content/posts/sql-structured-query-language-2/sql-structured-query-language-2.mdx index a34504d3..751e40fb 100644 --- a/content/posts/sql-structured-query-language-2/sql-structured-query-language-2.mdx +++ b/content/posts/sql-structured-query-language-2/sql-structured-query-language-2.mdx @@ -284,9 +284,122 @@ WHERE tarifa >= 500.00; # Procedimentos (`PROCEDURES`) - -**Em desenvolvimento...** - +As _Stored Procedures_ são rotinas definidas no banco de dados, indentificadas pelo por um nome pelo qual podem ser invocadas. Um procedimento pode executar uma série de de instruções e receber parâmetros. + +**Para que usar _stored procedures_?** + +Muitas vezes é requerido várias consultas e atualizações no DB, o que acarreta um maior consumo de recursos pela aplicação (desempenho, memória, etc.). No caso de aplicações web, isso se torna mais visível, devido a maior quantidade de informações que precisam trafegar pela rede e de requisições ao servidor. + +Fluxo de dados entre Aplicação, API e Banco de dados. +Fluxo de dados entre Aplicação, API e Banco de dados. + +Uma boa forma de contornar e atenuar esses consumo de recurso diretamente pela aplicação, é transferir parte do processamento para o DB. Assim, considerando que as máquinas servidoras geralmente têm configurações de hardware mais robustas (e nada se pode garantir com relação às máquinas clientes), essa pode ser uma "saída" a se considerar. + +**Usar ou não usar procedures?** + +Como exemplo para o funcionamento dos _Stored Procedures_, iremos comparar a execução de uma rotina utilizando e outra não utilizando essa técnica. + +Considere o seguinte contexto de uma aplicação comercial: +- O cliente fez um pedido no qual são inseridos itens +- O pedido (bem como os itens) permanecem com status "PENDENTE" até ser confirmado. +- O operador confirma o pedido e faz o registro no livro caixa. + +Até o pedido ser confirmado, nenhum lançamento é feito no livro caixa, então é preciso ter uma rotina de confirmação de pedido, que deve executar as seguintes ações: + +1. **`UPDATE{:sql}`** Atualizar o _status_ do pedido (**fechado, pendente**) +2. **`UPDATE{:sql}`** Atualizar o _status_ dos itens do pedido (**vendido, pendente**) +3. **`INSERT{:sql}`** Lançar o valor do pedido no caixa (**preço**) + +Temos então pelo menos 3 instruções de atualiação e/ou inserção. Poderíamos representar essa sitação graficamente pela figura: + +Gráfico da rotina de inserção cliente-database +Gráfico da rotina de inserção cliente-database + +Por outro lado, poderíamos agrupar essas três instrulções no corpo de um procedimento e chamá-lo a partir da aplicação uma única vez. + +As ações de `UPDATE{:sql}`/`INSERT{:sql}`/`DELETE{:sql}`, apartir daí, ficariam por conta do servidor. A representação gráfica desse modelo é mostrada a seguir (Através do procedimento chamado "CONFIRMAR PEDIDO"): + +Gráfico da pricedure 'CONFIRMAR PEDIDO' +Gráfico da pricedure 'CONFIRMAR PEDIDO' + + +**Vantagens**: +- Simplificação da execução de instruções SQL pela aplicação. +- Transferência de parte da responsabilidade de processamento para o servidor. +- Facilidade na manutenção, reduzindo a quantidade de alterações na aplicação. + + + +**Desvantagens**: +- Necessidade de maior conhecimento da sintaxe do banco de dados para escrita de rotinas em SQL (nível avançado). +- As rotinas ficam mais facilmente acessíveis. Alguém que tenha acesso ao banco de dados poderá visualizar e alterar o código. + + +## Criando uma PROCEDURE + +**Sintaxe** + +```sql +CREATE PROCEDURE nome_da_procedure(parametro1 tipo, parametro2 tipo, ...) +LANGUAGE SQL AS +$$ + +$$; +``` + +Onde, `parametro1`, `parametro2`, ... são os parâmetros que a procedure pode receber (opcionais, caso não ouver, deve se passar parênteses vazios `nome_da_procedure()`), `LANGUAGE SQL` indica que a procedure será escrita em SQL, `$$` é um delimitador de bloco de código e `` é o código SQL que será executado. + +**Exemplo** + +```sql +CREATE PROCEDURE insert_cliente(nome VARCHAR(39), cpf VARCHAR(11), celular VARCHAR(11)) +LANGUAGE SQL AS +$$ + INSERT INTO CLIENTE (nome, cpf, celular) + VALUES ((SELECT MAX(codigo_cliente) + 1 FROM cliente), nome, cpf, celular); +$$; +``` + +Tendo criado a _procedure_, chamá-lo é bastante simples. Para fazer isso fazemos o uso da palavra reservada CALL, como mostra o código a seguir: + +```sql +CALL (); +``` + +**Exemplo** + +```sql +CALL insert_cliente('Mateus Felipe', '00000000000', '37999999999'); +``` + +## Atualizando PROCEDURES + +Para atualiza o código de uma procedure, basta usar o comando `CREATE OR REPLACE PROCEDURE{:sql}`. + +```sql /OR REPLACE/ +CREATE OR REPLACE PROCEDURE update_preco(novo_preco NUMERIC, codigo_produto INTEGER) +LANGUAGE SQL AS +$$ + UPDATE PRODUTO SET preco = novo_preco WHERE codigo_produto = codigo_produto; +$$; +``` + +## Excluindo PROCEDURES + +Assim como outras estruturas no banco de dados, para exclusão de procedures basta fazer: + +**Sintaxe** + +```sql +DROP PROCEDURE nome_da_procedure; +``` + +**Exemplo** + +```sql +DROP PROCEDURE insert_cliente; +DROP PROCEDURE update_preco; +``` # Funções (`FUNCTIONS`)