0% found this document useful (0 votes)
32 views25 pages

Controlando o Fluxo de Execução: Loop For

The document discusses control flow statements and looping constructs in PL/SQL including IF-THEN-ELSE statements, CASE expressions, and various loop types (BASIC, WHILE, FOR). It provides syntax examples and explanations of how to use each construct properly. Key looping concepts covered include using labels to exit nested loops, rules for FOR loops, and the new CONTINUE statement to skip to the next iteration in a loop.

Uploaded by

NitroXDmaster
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
32 views25 pages

Controlando o Fluxo de Execução: Loop For

The document discusses control flow statements and looping constructs in PL/SQL including IF-THEN-ELSE statements, CASE expressions, and various loop types (BASIC, WHILE, FOR). It provides syntax examples and explanations of how to use each construct properly. Key looping concepts covered include using labels to exit nested loops, rules for FOR loops, and the new CONTINUE statement to skip to the next iteration in a loop.

Uploaded by

NitroXDmaster
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 25

Controlando o Fluxo de Execução

loop
for

while

1
Instrução IF

Sintaxe:

IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;

2
Instrução IF Simples

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
END IF;
END;
/

3
Instrução IF THEN ELSE

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
/

4
Cláusula IF ELSIF ELSE

DECLARE
v_myage number:=31;
BEGIN
IF v_myage < 11 THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSIF v_myage < 20 THEN
DBMS_OUTPUT.PUT_LINE(' I am young ');
ELSIF v_myage < 30 THEN
DBMS_OUTPUT.PUT_LINE(' I am in my twenties');
ELSIF v_myage < 40 THEN
DBMS_OUTPUT.PUT_LINE(' I am in my thirties');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am always young ');
END IF;
END;
/

5
Valor NULL na Instrução IF

DECLARE
v_myage number;
BEGIN
IF v_myage < 11 THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
/

6
Expressões CASE

• A expressão CASE seleciona e retorna um resultado.


• Para selecionar o resultado, a expressão CASE usa
expressões. O valor retornado por essas expressões é
usado para selecionar uma das várias alternativas.

CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
[ELSE resultN+1]
END;

7
Expressões CASE: Exemplo

SET VERIFY OFF


DECLARE
v_grade CHAR(1) := UPPER('&grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || '
Appraisal ' || v_appraisal);
END;
/

8
Expressões CASE Pesquisadas

DECLARE
v_grade CHAR(1) := UPPER('&grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE
WHEN v_grade = 'A' THEN 'Excellent'
WHEN v_grade IN ('B','C') THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || '
Appraisal ' || v_appraisal);
END;
/

9
Instrução CASE
DECLARE
v_deptid NUMBER;
v_deptname VARCHAR2(20);
v_emps NUMBER;
v_mngid NUMBER:= 108;
BEGIN
CASE v_mngid
WHEN 108 THEN
SELECT department_id, department_name
INTO v_deptid, v_deptname FROM departments
WHERE manager_id=108;
SELECT count(*) INTO v_emps FROM employees
WHERE department_id=v_deptid;
WHEN 200 THEN
...
END CASE;
DBMS_OUTPUT.PUT_LINE ('You are working in the '|| v_deptname||
' department. There are '||v_emps ||' employees in this
department');
END;
/

10
Tratando Valores Nulos

Ao trabalhar com nulos, é possível evitar alguns erros comuns


seguindo estas regras:
• Comparações simples envolvendo nulos sempre retornam
NULL.
• A aplicação do operador lógico NOT a um nulo retorna
NULL.
• Se a condição retornar NULL em instruções de controle
condicional, a sequência associada de instruções não será
executada.

11
Controle Iterativo: Instruções LOOP

• Os loops repetem uma instrução (ou uma sequência


de instruções) várias vezes.
• Há três tipos de loop:
– Loop básico
– Loop FOR
– Loop WHILE

12
Loops Básicos

Sintaxe:
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;

13
Loop Básico: Exemplo

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE country_id = v_countryid;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/

14
Loops WHILE

Sintaxe:
WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;

Use o loop WHILE para repetir instruções enquanto uma


condição for TRUE.

15
Loops WHILE: Exemplo

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
v_counter NUMBER := 1;
BEGIN
SELECT MAX(location_id) INTO v_loc_id FROM locations
WHERE country_id = v_countryid;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
v_counter := v_counter + 1;
END LOOP;
END;
/

16
Loops FOR

• Use um loop FOR para abreviar o teste diminuindo


o número de iterações.
• Não declare o contador; ele é declarado implicitamente.

FOR counter IN [REVERSE]


lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;

17
Loops FOR: Exemplo

DECLARE
v_countryid locations.country_id%TYPE := 'CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_loc_id
FROM locations
WHERE country_id = v_countryid;
FOR i IN 1..3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_loc_id + i), v_new_city, v_countryid );
END LOOP;
END;
/

18
Regras do Loop FOR

• Faça referência ao contador apenas dentro do loop; fora


do loop ele é indefinido.
• Não faça referência ao contador como o destino de uma
designação.
• Nenhum limite de loop pode ser NULL.

19
Sugestão de Utilização de Loops

• Use o loop básico quando as instruções dentro do loop


precisarem ser executadas pelo menos uma vez.
• Use o loop WHILE se a condição precisar ser avaliada no
início de cada iteração.
• Use um loop FOR se o número de iterações for conhecido.

20
Loops Aninhados e Labels

• É possível aninhar loops em vários níveis.


• Use labels para diferenciar blocos e loops.
• Saia do loop externo com a instrução EXIT que faz
referência ao label.

21
Loops Aninhados e Labels: Exemplo

...
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
/

22
Instrução CONTINUE do Código PL/SQL

• Definição
– Adiciona a funcionalidade para iniciar a próxima iteração
de loop
– Permite que programadores possam transferir o controle
para a próxima iteração de um loop
– Usa estrutura e semântica paralela na instrução EXIT
• Vantagens
– Facilita o processo de programação
– Pode oferecer um pequeno aperfeiçoamento do
desempenho em relação às soluções de programação
anteriores para simular a instrução CONTINUE

23
Instrução CONTINUE do Código PL/SQL: Exemplo 1

DECLARE
v_total SIMPLE_INTEGER := 0;
BEGIN
FOR i IN 1..10 LOOP
1 v_total := v_total + i;
dbms_output.put_line
('Total is: ' || v_total);
CONTINUE WHEN i > 5;
v_total := v_total + i;
2 dbms_output.put_line
('Out of Loop Total is:
' || v_total);
END LOOP;
END;
/

24
Instrução CONTINUE do Código PL/SQL: Exemplo 2
DECLARE
v_total NUMBER := 0;
BEGIN
<<BeforeTopLoop>>
FOR i IN 1..10 LOOP
v_total := v_total + 1;
dbms_output.put_line
('Total is: ' || v_total);
FOR j IN 1..10 LOOP
CONTINUE BeforeTopLoop WHEN i + j > 5;
v_total := v_total + 1;
END LOOP;
END LOOP;
END two_loop;

25

You might also like