A abaixo, escrita em PL/SQL, contém uma série de erros re...
CREATE TABLE func_temp AS SELECT func_id, nome, sobrenome FROM func; CREATE TABLE func_temp2 AS SELECT func_id, nome, sobrenome FROM func;
CREATE TABLE func_temp2 AS SELECT func_id, nome, sobrenome FROM func;
DECLARE
sequencial NUMBER;
BEGIN
sequencial := func_seq.NEXTVAL;
DBMS_OUTPUT.PUT_LINE ('Valor Sequencial Inicial: ' ||
TO_CHAR(sequencial));
INSERT INTO func_temp VALUES (func_seq.NEXTVAL,
'Carolina', 'Novaes');
-- Insere em func_temp2 o mesmo sequencial inserido em func_temp
INSERT INTO func_temp2 VALUES (func_seq.NEXTVAL, 'Antonio', 'Novaes');
DELETE FROM func_temp2 WHERE func_id = func_seq.CURRVAL;
UPDATE func_temp SET func_id = func_seq.NEXTVAL
WHERE nome = 'Carolina'AND sobrenome = 'Novaes'; sequencial := func_seq.CURRVAL;
DBMS_OUTPUT.PUT_LINE ('Valor Sequencial Final: ' ||
TO_CHAR(sequencial));
END;
/
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: D - a função NEXTVAL não pode ser utilizada na cláusula SET do comando UPDATE.
Para abordar a questão proposta, é importante ter familiaridade com os conceitos de sequências (sequences) no PL/SQL. Sequências são objetos de banco de dados utilizados para gerar números sequenciais únicos, comumente empregados para atribuir valores automáticos a colunas de tabelas, como chaves primárias.
Os métodos NEXTVAL e CURRVAL são utilizados em conjunto com sequências. O NEXTVAL é usado para incrementar a sequência e obter o próximo valor disponível, enquanto o CURRVAL é usado para recuperar o valor atual da sequência, ou seja, o último valor gerado pelo NEXTVAL na sessão corrente.
O motivo pelo qual a alternativa D está correta é que o NEXTVAL não deve ser utilizado na cláusula SET de um comando UPDATE. Isso ocorre porque a cláusula SET espera um valor específico para atualizar uma coluna, e o uso de NEXTVAL poderia gerar vários valores diferentes caso a cláusula WHERE do UPDATE afetasse múltiplas linhas, levando a uma inconsistência de dados e violando a integridade referencial do banco de dados.
Em outras palavras, se você usar NEXTVAL em um UPDATE que afeta mais de uma linha, cada linha receberia um valor diferenciado, o que não é o comportamento desejado em operações de atualização, já que se espera que todas as linhas afetadas recebam o mesmo novo valor.
Portanto, o uso correto do NEXTVAL em um UPDATE seria por meio de um sub-select que garanta a geração de um único valor a ser atribuído a todas as linhas afetadas pela operação. Isso mantém a consistência dos dados atualizados.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo