Você está na página 1de 6

Please

note that GitHub no longer supports your web browser.


We recommend upgrading to the latest Google Chrome or Firefox.
Ignore

Learn more

Instantly share code, notes, and snippets.

alexjosesilva / 1.sql
Last active May 28, 2019

Embed Download ZIP


<script src="https://gist.github.com/alexjosesilva/e19a2
Bateria de Exercícios em PL-SQL

1.sql

1 /*1. Criar um bloco PL/SQL anônimo para imprimir a tabuada abaixo:*/


2
3 DECLARE
4 VN CONSTANT NUMBER(2):=5;
5 BEGIN
6 FOR i IN 1..10 LOOP
7 SYS.DBMS_OUTPUT.PUT_LINE(VN || ' X ' || i ||'='|| VN*i);
8 END LOOP;
9 END;
10

10.sql

1 /*
2 10. Criar uma função que deverá receber um número inteiro e retornar se o mesmo
3 é primo ou não.
4 (Lembrete: Números primos são divisíveis somente por eles mesmos e por um).
5 */
6
7 DECLARE
8
9 FUNCTION PRIMO (NUMERO NUMBER) RETURN VARCHAR2 IS
10
11 VSQRT NUMBER(4);
12 VDIV NUMBER(4);
13 VRESULT VARCHAR(20):='É PRIMO';
14
15 BEGIN
16 --RAIZ QUADRADA DO NUMERO
17 VSQRT := SQRT(NUMERO);
18
19 FOR I IN 2..VSQRT LOOP
20 IF(MOD(NUMERO,I)=0 AND NUMERO<>I)THEN
21 VRESULT := 'NAO É PRIMO';
22 END IF;
23 END LOOP;
24 RETURN VRESULT;
25 END;
26
27 BEGIN
28
29 DBMS_OUTPUT.PUT_LINE(PRIMO(4));
30
31 END;

11.sql

1 /*
2 11. Criar uma função que deverá receber um valor correspondente à temperatura
3 em graus Fahrenheit e retornar o equivalente em graus Celsius. Fórmula para

4 conversão: C = (F ‐ 32) / 1.8


5 */
6
7 DECLARE
8
9 FUNCTION TempC (TempF number)
10 RETURN number
11 IS
12
13 BEGIN
14
15 RETURN ((TempF-32)/1.8);
16
17 END TempC;
18
19 BEGIN
20
21 DBMS_OUTPUT.PUT_LINE(TempC(50));
22
23 END;

2.sql

1 /*2. Criar um bloco PL/SQL anônimo para imprimir a tabuada abaixo:*/


2
3 DECLARE
4
5 BEGIN
6 FOR i IN 1..10 LOOP
7 FOR j IN 1..10 LOOP
8 DBMS_OUTPUT.PUT_LINE(i || ' X ' || j ||'='|| i*j);
9 END LOOP;
10 DBMS_OUTPUT.PUT_LINE('');
11 END LOOP;
12 END;
13

3.sql

1 /*
2 3. Criar um bloco PL/SQL para apresentar os anos bissextos entre 2000 e 2100. Um ano será bissexto
3 quando for possível dividi‐lo por 4, mas não por 100 ou quando for possível dividi‐lo por 400.
4 */
5
6 DECLARE
7 VANO NUMBER(3);
8 BEGIN
9 FOR VANO IN 2000..2100 LOOP
10 IF(MOD(VANO,4)=0 AND MOD(VANO,100)!=0 ) OR(MOD(VANO,400)=0) THEN
11 DBMS_OUTPUT.PUT_LINE(VANO);
12 END IF;
13 END LOOP;
14 END;

4.sql

1 /*
2 4.Criar um bloco PL/SQL para atualizar a tabela abaixo, conforme segue:
3 Produtos categoria A deverão ser reajustados em 5%
4 Produtos categoria B deverão ser reajustados em 10%
5 Produtos categoria C deverão ser reajustados em 15%
6 */
7
8 /*criar Tabela*/
9 CREATE TABLE PRODUTO (
10 CODIGO NUMBER(4),
11 CATEGORIA CHAR(1),
12 VALOR NUMBER(4,2));
13
14 /*inserir dados na tabela*/
15 INSERT INTO PRODUTO VALUES (1001,'A',7.55);
16 INSERT INTO PRODUTO VALUES (1002,'B',5.95);
17 INSERT INTO PRODUTO VALUES (1003,'C',3.45);
18
19 /*Solução*/
20
21 DECLARE
22
23 /* CURSOR */
24 CURSOR PRO IS
25 SELECT * FROM PRODUTO_TESTE2;
26
27 /*VARIAVEL VPROD: com o mesmo valor da tabela*/
28 VPROD PRODUTO_TESTE2%ROWTYPE;
29
30 BEGIN
31 FOR VPROD IN PRO LOOP
32
33 CASE VPROD.CATEGORIA
34 WHEN 'A' THEN UPDATE PRODUTO_TESTE2 SET VALOR = VALOR + (VALOR*0.5) WHERE VPROD.CODIGO = CODIGO;
35 WHEN 'B' THEN UPDATE PRODUTO_TESTE2 SET VALOR = VALOR + (VALOR*1.5) WHERE VPROD.CODIGO = CODIGO;
36 WHEN 'C' THEN UPDATE PRODUTO_TESTE2 SET VALOR = VALOR + (VALOR*2.0) WHERE VPROD.CODIGO = CODIGO;
37 END CASE;
38 END LOOP;
39 END;

5.sql

1 /*
2 5. Criar um bloco PL/SQL para imprimir a sequência de Fibonacci: 1 1 2 3 5 8 13 21 34 55
3 */
4
5 DECLARE
6
7 VA NUMBER(2):=1;
8 VB NUMBER(2):=1;
9 VC NUMBER(2):=0;
10
11 BEGIN
12
13 FOR N IN 1..11 LOOP
14 VA := VB;
15 VB := VC;
16 DBMS_OUTPUT.PUT_LINE(VC);
17 VC := VA + VB;
18 END LOOP;
19
20 END;

6.sql

1 /*
2 6. Criar uma procedure que deverá receber o código de um cliente e a partir deste dado imprimir o seu
3 nome, e seu e‐mail. Os dados deverão ser obtidos a partir de uma tabela chamada CLIENTE com as
4 seguintes colunas (COD_CLI,NOME_CLI,EMAIL_CLI)
5 */
6
7 /* Criar a tabela cliente */
8 CREATE TABLE CLIENTE (
9 COD_CLI NUMBER(4) PRIMARY KEY,
10 NOME_CLI VARCHAR2(30),
11 EMAIL_CLI VARCHAR2(30));
12
13 /* inserir o dado*/
14 INSERT INTO CLIENTE VALUES (10,'BEATRIZ BERNARDES','bb@dominio.com.br');
15
16 /*solução*/
17 CREATE OR REPLACE PROCEDURE BUSCACLIENTE(CODCLIENTE NUMBER) IS
18 VCLIENTE CLIENTE%ROWTYPE;
19 BEGIN
20
21 SELECT *
22 INTO VCLIENTE
23 FROM CLIENTE
24 WHERE COD_CLI = CODCLIENTE;
25 DBMS_OUTPUT.put_line('NOME: '||VCLIENTE.NOME_CLI || 'EMAIL: '||VCLIENTE.EMAIL_CLI);
26
27 END;

7.sql

1 /*
2
3 7. Criar uma procedure que receberá um RA, um NOME e quatro notas conforme a
4 sequência: (RA,NOME,A1,A2,A3,A4).
5
6 A partir destes valores deverá efetuar o cálculo da média somando o maior valor
7 entre A1 e A2 às notas A3 e A4 e dividindo o valor obtido por três (achando a média).
8
9 Se a média for menor que 6 (seis) o aluno estará REPROVADO e se a média for
10 igual ou superior a 6 (seis) o aluno estará APROVADO.
11
12 A procedure deverá inserir os valores acima numa tabela denominada ALUNO com as
13 seguintes colunas RA,NOME,A1,A2,A3,A4,MEDIA,RESULTADO
14
15 */
16
17 DECLARE
18
19 /*CALCULAR MEDIA*/
20 PROCEDURE INSERIRNOTASALUNO(RA NUMBER, NOME VARCHAR2,N1 NUMBER,N2 NUMBER,N3 NUMBER,N4 NUMBER) IS
21
22 VMAIOR NUMBER;
23 VMEDIA NUMBER;
24 VRESULTADO VARCHAR(20);
25
26 BEGIN
27 /*MAIOR NOTA*/
28 IF(N1>N2) THEN
29 VMAIOR := N1;
30 ELSE
31 VMAIOR := N2;
32 END IF;
33
34 /*CALCULO DA MEDIA*/
35 VMEDIA := (VMAIOR+(N3+N4))/3;
36
37 /*DETERMINAR A NOTA*/
38 IF VMEDIA < 6 THEN
39 VRESULTADO := 'REPROVADO';
40 ELSE
41 VRESULTADO := 'APROVADO';
42 END IF;
43 /* INSERT */
44 INSERT INTO ALUNO VALUES (RA,NOME,N1,N2,N3,N4,VRESULTADO,VMEDIA);
45 COMMIT;
46 END;
47
48 --Calcular a média somente dos alunos sem média
49
50 PROCEDURE CALCULARMEDIA IS
51
52 CURSOR TALUNO IS
53 SELECT * FROM ALUNO;
54 TA ALUNO%rowtype;
55
56 BEGIN
57 FOR TA IN TALUNO LOOP
58 IF(ALUNO.MEDIA IS NULL) THEN
59 UPDATE ALUNO
60 SET ALUNO.MEDIA = (ALUNO.NOTA1+ALUNO.NOTA2+ALUNO.NOTA3+ALUNO.NOTA4)/4
61 WHERE ALUNO.RA=TA.RA;
62 END IF;

63 END LOOP;
64
65 END;
66
67 BEGIN
67 BEGIN
68
69 --inserir novos alunos e calcular a media com as notas
70 INSERIRNOTASALUNO(7,'XUXA',10,3,4,8);
71
72 --calcular a media dos alunos existentes
73 CALCULARMEDIA;
74
75 END;
76
77

8.sql

1 DECLARE
2
3 PROCEDURE CALCULA_IPI(CODPRODUTO NUMBER ) IS
4
5 VPRO PRODUTO_TESTE2.VALOR%TYPE;
6 VIPI ALIQUOTA.IPI%TYPE;
7 TIPI NUMBER(6,2);
8
9 BEGIN
10
11 --ENCONTRAR O VALOR DA TABELA PRODUTO
12 SELECT P.VALOR
13 INTO VPRO
14 FROM PRODUTO_TESTE2 P
15 WHERE P.CODIGO = CODPRODUTO;
16
17 --ENCONTRAR O VALOR DA TABELA IPI
18 SELECT A.IPI
19 INTO VIPI
20 FROM PRODUTO_TESTE2 P
21 INNER JOIN ALIQUOTA A
22 ON P.CATEGORIA = A.COD_CAT
23 WHERE P.CODIGO = CODPRODUTO;
24
25 --CALCULO DO VALOR DO IP
26 TIPI := VPRO * (VIPI/100);
27
28 --EXIBIR NA TELA
29 DBMS_OUTPUT.PUT_LINE('TOTAL IPI: ' || TIPI);
30 END;
31
32 BEGIN
33
34 CALCULA_IPI(1003);
35
36 END;

9.sql

1 /*
2 9. Uma empresa oferece um bônus a seus funcionários com base no lucro liquido (tabela LUCRO) obtido
3 durante o ano e no valor do salário do funcionário (tabela SALARIO). O bônus é calculado conforme a
4 seguinte formula: BONUS = LUCRO * 0.01 + SALARIO * 0.05. Crie uma procedure que receba o ano (tabela
5 LUCRO) e número de matricula do funcionário e devolva (imprima) o valor do seu respectivo bônus.
6 */
7
8 --Criar tabela lucro
9 CREATE TABLE LUCRO (
10 ANO NUMBER(4),
11 VALOR NUMBER(9,2));
12
13 --inserir
14 INSERT INTO LUCRO VALUES (2007,1200000);
15 INSERT INTO LUCRO VALUES (2008,1500000);
16 INSERT INTO LUCRO VALUES (2009,1400000);
17
18 -- Criar tabel Salario
19 CREATE TABLE SALARIO (
20 MATRICULA NUMBER(4),
20 MATRICULA NUMBER(4),
21 VALOR NUMBER(7,2));
22
23 --inserir
24 INSERT INTO SALARIO VALUES (1001,2500);
25 INSERT INTO SALARIO VALUES (1002,3200);
26
27 --solução
28 /*
29 9. Uma empresa oferece um bônus a seus funcionários com base no lucro liquido (tabela LUCRO) obtido
30 durante o ano e no valor do salário do funcionário (tabela SALARIO).
31 O bônus é calculado conforme a seguinte formula: BONUS = LUCRO * 0.01 + SALARIO * 0.05.
32 Crie uma procedure que receba o ano (tabela LUCRO) e número de matricula do
33 funcionário e devolva (imprima) o valor do seu respectivo bônus.
34
35 */
36
37
38
39 CREATE OR REPLACE PROCEDURE CALCULA_BONUS (P_ANO LUCRO.ANO%TYPE,P_MAT SALARIO.MATRICULA%TYPE) IS
40
41 V_VL_LUCRO LUCRO.VALOR%TYPE;
42 V_VL_SALARIO SALARIO.VALOR%TYPE;
43 V_BONUS NUMBER(7,2);
44
45 BEGIN
46
47 SELECT VALOR INTO V_VL_LUCRO FROM LUCRO
48 WHERE ANO = P_ANO;
49
50 SELECT VALOR INTO V_VL_SALARIO FROM SALARIO
51 WHERE MATRICULA = P_MAT;
52
53 V_BONUS := V_VL_LUCRO * 0.01 + V_VL_SALARIO * 0.05;
54 DBMS_OUTPUT.PUT_LINE ('Valor do Bonus: ' || V_BONUS);
55
56 END;
57 /
58
59 EXECUTE CALCULA_BONUS (2007,1001);