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;
Certa, porque traz a declaração correta do cursor e o FETCH compatível com a leitura das colunas CPF e nome.
- B)DECLARE teste as SELECT CPF, nome FROM pessoa; READ teste into v_CPF, v_nome;
Errada, porque DECLARE teste as não é sintaxe válida para cursor em PL/SQL e READ não é comando de FETCH no Oracle.
- C)SET CURSOR teste as SELECT CPF, nome FROM pessoa; RETRIEVE teste into v_CPF, v_nome;
Errada, porque SET CURSOR e RETRIEVE não são comandos válidos na sintaxe de cursores do PL/SQL.
- D)teste = INPUT (SELECT CPF, nome FROM pessoa); NEXT teste INTO v_CPF, v_nome;
Errada, porque INPUT e NEXT não pertencem à linguagem PL/SQL para manipulação de cursor explícito.
- E)WITH teste as SELECT CPF, nome FROM pessoa; GET v_CPF=CPF, v_nome=nome FROM teste;
Errada, porque WITH não declara cursor dessa forma e GET ... FROM ... não é a sintaxe correta de FETCH no Oracle.
Gabarito: A
Em PL/SQL, cursores servem para percorrer um conjunto de linhas retornado por uma consulta. A lógica clássica é: declarar o cursor com a consulta, abrir o cursor, buscar linha a linha com FETCH, testar se acabou com %NOTFOUND e, ao final, fechar o cursor. Aqui, o script mostra exatamente essa sequência: OPEN teste; depois vem o FETCH com as variáveis v_CPF e v_nome, e em seguida o EXIT WHEN teste%NOTFOUND. No Oracle, a declaração correta de um cursor explícito usa a palavra-chave CURSOR, assim como em "CURSOR teste IS SELECT CPF, nome FROM pessoa;". Já o FETCH precisa trazer os campos do cursor para variáveis compatíveis, no caso "FETCH teste INTO v_CPF, v_nome;". Isso combina com os tipos definidos por %TYPE, o que ajuda a evitar erro de incompatibilidade de tipo. Perceba que o cursor só pode ser consultado depois de aberto, e o teste de fim de dados com %NOTFOUND é um padrão bem comum em prova. Se você conhece a triade abre, busca, fecha, metade do caminho já está andando. O resto é o Oracle fazendo seu teatro procedural habitual. Portanto, a alternativa A está correta porque completa o código com a declaração do cursor e com o FETCH adequado ao uso de cursor explícito em PL/SQL.