Considere o script Oracle PL/SQL a seguir.DECLARE var_x(2);B...
DECLARE var_x(2); BEGIN UPDATE calendario SET dia = dia + 1; IF ....... THEN dbms_output.put_line('Zero alterados.'); ELSIF ....... THEN var_x:= ....... ; dbms_output.put_line(var_x || ' alterados.'); END IF; END;
Para que esse script funcione corretamente, os três trechos pontilhados devem ser substituídos, na ordem em que aparecem, por
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a D - SQL%NOTFOUND / SQL%FOUND / SQL%ROWCOUNT. Para entendermos o porquê, precisamos conhecer algumas pseudo-colunas de status em PL/SQL que são utilizadas para verificar o resultado de comandos DML (Data Manipulation Language), como INSERT, UPDATE e DELETE.
As pseudo-colunas são:
- SQL%NOTFOUND - Retorna TRUE se a última instrução DML executada não afetou nenhuma linha.
- SQL%FOUND - Retorna TRUE se a última instrução DML executada afetou pelo menos uma linha.
- SQL%ROWCOUNT - Retorna o número de linhas afetadas pela última instrução DML.
No script apresentado, o uso destas pseudo-colunas serve para:
- Verificar se o UPDATE não modificou nenhum registro (SQL%NOTFOUND).
- Verificar se o UPDATE modificou algum registro (SQL%FOUND).
- Atribuir à variável var_x o número de registros alterados pelo UPDATE (SQL%ROWCOUNT).
Portanto, substituindo os trechos pontilhados com estas pseudo-colunas, conseguimos verificar se registros foram alterados e exibir a quantidade correspondente, o que faz da opção D a correta para que o script funcione conforme esperado.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
SQL%NOTFOUND / SQL%FOUND / SQL%ROWCOUNT
%NOTFOUND- Returns INVALID_CURSOR if cursor is declared, but not open; or if cursor has been closed.
- Return NULL if cursor is open, but fetch has not been executed.
- Returns FALSE if a successful fetch has been executed.
- Returns TRUE if no row was returned.
%ROWCOUNT- Returns INVALID_CURSOR if cursor is declared, but not open; or if cursor has been closed.
- Returns the number of rows fetched.
- The ROWCOUNT attribute doesn't give the real row count until you have iterated through the entire cursor. In other words, you shouldn't rely on this attribute to tell you how many rows are in a cursor after it is opened.
# Apenas trazendo o código com cada comando em uma linha para ajudar na interpretação
DECLARE var_x(2); BEGIN
UPDATE calendario SET dia = dia + 1;
IF ....... THEN
dbms_output.put_line('Zero alterados.');
ELSIF ....... THEN
var_x:= ....... ;
dbms_output.put_line(var_x || ' alterados.');
END IF;
END;
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo