Lista de Exercícios propostos para auto desenvolvimento do aprendizado em programação, Exercícios Programação PL/SQL ORACLE (com resolução).
Para aplicação deste estudo de caso é possível usar o ORACLE Live SQL, que é um serviço da Oracle destinado ao aprendizado de SQL e PL/SQL.
É uma ferramenta que dá acesso a seus usuários a uma instância de uma base de dados Oracle (sem necessidade de instalação), inclusive com o modelo de exemplo HR (Human Resource) para testes.
Para usar o Oracle Live SQL é necessário criar uma conta no site da Oracle, leia mais sobre clicando aqui.
Entretanto, requer conhecimento prévio em PL/SQL, para exercitar os Exercícios Programação PL/SQL ORACLE.
Exercício 1
Criar uma procedure que receba um código de pessoa como parâmetro de entrada e através de um parâmetro de saída retorne o nome da pessoa. Caso, o código seja inexistente, retorne: Pessoa não encontrada.
Script para criar a tabela e inserir dados para testes:
CREATE TABLE PESSOA( ID NUMBER(4) PRIMARY KEY, NOME VARCHAR2(120) NOT NULL, CONSTRAINT UQ_NOME_PESSOA UNIQUE (NOME) ); INSERT INTO PESSOA (ID, NOME) VALUES (1, 'João Silva'); INSERT INTO PESSOA (ID, NOME) VALUES (2, 'Maria Silva'); INSERT INTO PESSOA (ID, NOME) VALUES (3, 'Claudia Souza'); INSERT INTO PESSOA (ID, NOME) VALUES (4, 'Jurema Paschoal'); INSERT INTO PESSOA (ID, NOME) VALUES (5, 'André Paulo'); COMMIT;
Quatro casos de teste devem ser exercitados na execução da procedure criada.
- Primeiramente, teste com o valor 4 para o parâmetro de entrada, que deve ter o retorno Jurema Paschoal.
- Posteriormente, faça o teste com o valor 9 para o parâmetro de entrada, que deve ter o retorno Pessoa não encontrada.
- Continue os testes com o valor NULL para o parâmetro de entrada, que deve ter o retorno Pessoa não encontrada.
- Por fim, teste com o valor -15 para o parâmetro de entrada, que deve ter o retorno Pessoa não encontrada.
Resolução Exercício 1:
CREATE TABLE PESSOA(
ID NUMBER(4) PRIMARY KEY,
NOME VARCHAR2(120) NOT NULL,
CONSTRAINT UQ_NOME_PESSOA UNIQUE (NOME)
);
INSERT INTO PESSOA (ID, NOME) VALUES (1, 'João Silva');
INSERT INTO PESSOA (ID, NOME) VALUES (2, 'Maria Silva');
INSERT INTO PESSOA (ID, NOME) VALUES (3, 'Claudia Souza');
INSERT INTO PESSOA (ID, NOME) VALUES (4, 'Jurema Paschoal');
INSERT INTO PESSOA (ID, NOME) VALUES (5, 'André Paulo');
COMMIT;
CREATE OR REPLACE PROCEDURE PROC_PEGARNOMEPESSOA (P_ID IN NUMBER, P_SAIDA OUT VARCHAR2)
IS
V_QTDE NUMBER(1);
V_NOME PESSOA.NOME%TYPE;
BEGIN
IF P_ID > 0 AND P_ID <= 9999 THEN
SELECT COUNT(*) INTO V_QTDE FROM PESSOA WHERE ID = P_ID;
IF V_QTDE = 1 THEN
SELECT NOME INTO V_NOME FROM PESSOA WHERE ID = P_ID;
P_SAIDA := V_NOME;
ELSE
P_SAIDA := 'Pessoa não encontrada';
END IF;
ELSE
P_SAIDA := 'Pessoa não encontrada';
END IF;
END;
--CASO DE TESTE 1
DECLARE
RETORNO VARCHAR2(120);
BEGIN
PROC_PEGARNOMEPESSOA(4, RETORNO);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA PROCEDURE: ' || RETORNO);
END;
---CASO DE TESTE 2
DECLARE
RETORNO VARCHAR2(120);
BEGIN
PROC_PEGARNOMEPESSOA(9, RETORNO);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA PROCEDURE: ' || RETORNO);
END;
---CASO DE TESTE 3
DECLARE
RETORNO VARCHAR2(120);
BEGIN
PROC_PEGARNOMEPESSOA(NULL, RETORNO);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA PROCEDURE: ' || RETORNO);
END;
---CASO DE TESTE 4
DECLARE
RETORNO VARCHAR2(120);
BEGIN
PROC_PEGARNOMEPESSOA(-15, RETORNO);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA PROCEDURE: ' || RETORNO);
END;
Exercício 2
Criar uma função que receba como parâmetro de entrada o código do produto e o número que representa o percentual de aumento do produto em questão.
O script abaixo representa a tabela de PRODUTO e os registros que devem ser inseridos:
CREATE TABLE PRODUTO( ID NUMBER(4) PRIMARY KEY, NOME VARCHAR2(120) NOT NULL, PRECO NUMBER(6,2) NOT NULL, CONSTRAINT UQ_NOME_PRODUTO UNIQUE (NOME) ); INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (1, 'Caneta', 2.50); INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (2, 'Papel', 12.30); INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (3, 'Borracha', 0.45); INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (4, 'Lápis', 1.50); INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (5, 'Pincel', 6); COMMIT;
Algumas checagens devem ser realizadas:
- Caso, o código do produto passado não seja encontrado deve retornar o valor -999, que representará produto não encontrado.
- O produto na execução da função, só pode sofrer aumentos de valores de percentual maiores que zero e menor ou igual a 15. Se essa regra for infringida, deve retornar o código -998.
- Caso todas as checagem sejam atendidas o produto deve ter seu preço aumentado no percentual passado (UPDATE) e a função deve retornar o código 0 para indicar que deu certo a execução.
Quatro casos de teste devem ser exercitados na execução da Função criada.
- Primeiramente, teste a função passando os seguintes valores para os parâmetros de entrada, código do produto igual a 4 e percentual igual a 12.
- Posteriormente, teste a função passando os seguintes valores para os parâmetros de entrada, código do produto igual a 3 e percentual igual a 2,32.
- Realizar o teste a função passando os seguintes valores para os parâmetros de entrada, código do produto igual a 2 e percentual igual a 20.
- Por fim, teste a função passando os seguintes valores para os parâmetros de entrada, código do produto igual a 9 e percentual igual a 10.
Considere o Desafio: Implemente o mínimo de um tratamento de exceções, leia esta postagem para entender: Tratamento de Exceções.
Resolução Exercício 2:
CREATE TABLE PRODUTO(
ID NUMBER(4) PRIMARY KEY,
NOME VARCHAR2(120) NOT NULL,
PRECO NUMBER(6,2) NOT NULL,
CONSTRAINT UQ_NOME_PRODUTO UNIQUE (NOME)
);
INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (1, 'Caneta', 2.50);
INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (2, 'Papel', 12.30);
INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (3, 'Borracha', 0.45);
INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (4, 'Lápis', 1.50);
INSERT INTO PRODUTO (ID, NOME, PRECO) VALUES (5, 'Pincel', 6);
COMMIT;
CREATE OR REPLACE FUNCTION FUNC_AUMENTOPRECOPRODUTO (P_IDPROD IN NUMBER, P_PERC IN NUMBER)
RETURN NUMBER
IS
RET NUMBER(3) := 0;
V_QTDE NUMBER(1);
BEGIN
IF P_IDPROD > 0 AND P_IDPROD <= 9999 THEN
IF P_PERC > 0 AND P_PERC <= 15 THEN
SELECT COUNT(*) INTO V_QTDE FROM PRODUTO WHERE ID = P_IDPROD;
IF V_QTDE = 1 THEN
UPDATE PRODUTO SET PRECO = PRECO + (PRECO * (P_PERC/100))
WHERE ID = P_IDPROD;
RET := 0;
ELSE
RET := -999; -- ID PRODUTO FORA DA FAIXA, ENTÃO NÃO ENCONTRADO
END IF;
ELSE
RET := -998; -- PERCENTUAL FORA DA FAIXA DE VALOR PERMITIDO
END IF;
ELSE
RET := -999; -- ID PRODUTO FORA DA FAIXA, ENTÃO NÃO ENCONTRADO
END IF;
COMMIT;
RETURN RET;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('CODIGO DO ERRO: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('DESCRICAO DO ERRO: ' || SQLERRM);
RETURN SQLCODE;
END;
---CASO DE TESTE 1
DECLARE
X NUMBER(4);
BEGIN
X := FUNC_AUMENTOPRECOPRODUTO(4, 12);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA FUNÇÃO: ' || X);
END;
---CASO DE TESTE 2
DECLARE
X NUMBER(4);
BEGIN
X := FUNC_AUMENTOPRECOPRODUTO(3, 2.32);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA FUNÇÃO: ' || X);
END;
---CASO DE TESTE 3
DECLARE
X NUMBER(4);
BEGIN
X := FUNC_AUMENTOPRECOPRODUTO(2, 20);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA FUNÇÃO: ' || X);
END;
---CASO DE TESTE 4
DECLARE
X NUMBER(4);
BEGIN
X := FUNC_AUMENTOPRECOPRODUTO(9, 10);
DBMS_OUTPUT.PUT_LINE('RESULTADO DA EXECUÇÃO DA FUNÇÃO: ' || X);
END;
SELECT * FROM PRODUTO;
Para acessar mais artigos relacionados a banco de dados, clique aqui.
