Questão nº 32
Questão de Suporte em Tecnologia da Informação · FGV TJDFT 2022 (nº 32)
No contexto do uso de cursores por meio do Oracle PL/SQL, analise o script a seguir.
```
DECLARE
v_CPF pessoa.CPF%type;
v_nome pessoa.nome%type;
BEGIN
OPEN teste;
LOOP
EXIT WHEN teste %notfound;
EXEC sp_inclui_beneficio(v_CPF);
END LOOP;
CLOSE teste;
END;
```
As linhas que substituem corretamente os trechos tracejados na quarta e na oitava linhas do script acima são, respectivamente:
- A```
CURSOR teste is SELECT CPF, nome FROM pessoa;
FETCH teste into v_CPF, v_nome;
``` (alternativa correta) - B```
DECLARE teste as SELECT CPF, nome FROM pessoa;
READ teste into v_CPF, v_nome;
``` - C```
SET CURSOR teste as SELECT CPF, nome FROM pessoa;
RETRIEVE teste into v_CPF, v_nome;
``` - D```
teste = INPUT (SELECT CPF, nome FROM pessoa);
NEXT teste INTO v_CPF, v_nome;
``` - E```
WITH teste as SELECT CPF, nome FROM pessoa;
GET v_CPF=CPF, v_nome=nome FROM teste;
```
Resposta comentada
Gabarito Alternativa A
Conceito-chave: Um cursor é um "ponteiro" que percorre linha a linha o resultado de uma consulta SELECT. Para usá-lo, você primeiro o declara com CURSOR ... IS, depois o abre com OPEN, e a cada iteração do loop usa o comando FETCH para buscar os dados nas variáveis.
- (A) Correta: É exatamente a sintaxe padrão do PL/SQL:
CURSOR teste IS SELECT ...declara o cursor, eFETCH teste INTO v_CPF, v_nomebusca a próxima linha e armazena os valores nas variáveis, que serão usadas na chamada da procedure. - (B) Incorreta:
DECLARE teste as SELECTnão existe em PL/SQL; o comando correto éCURSOR ... IS. Além disso,READnão é um comando válido para cursores — o correto éFETCH. - (C) Incorreta:
SET CURSOReRETRIEVEsão comandos de outras linguagens (como SQL Server ou pseudo-código), não do Oracle PL/SQL. A sintaxe correta éCURSOR ... ISeFETCH ... INTO. - (D) Incorreta:
teste = INPUT (...)parece uma atribuição de variável comum, mas cursores não são atribuídos dessa forma.NEXTtambém não é o comando de leitura do PL/SQL; o correto éFETCH. - (E) Incorreta:
WITH teste as SELECTé usado em subconsultas (CTE), não para declarar cursores.GETnão é um comando de cursor no Oracle; o comando éFETCH.
Armadilha do distrator mais tentador (B): A banca tenta confundir quem confunde DECLARE (usado para variáveis) com CURSOR. Lembre-se: no PL/SQL, cursor se declara com CURSOR nome IS, e a leitura é sempre com FETCH ... INTO. Qualquer verbo como READ, RETRIEVE, NEXT ou GET é pegadinha de outras linguagens.
Fonte: FGV TJDFT 2022 Analista Judiciário - Suporte em Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.