Instrução SELECT Instrução SELECT Cláusula ORDER BYnecessária para garantir a ordem dos resultados

A instrução SELECT consiste de uma consulta com uma Cláusula ORDER BY opcional, e uma Cláusula FOR UPDATE opcional. A instrução SELECT possui este nome porque tipicamente a primeira palavra da construção da consulta é SELECT (A consulta inclui a expressão VALUES, as expressões UNION, INTERSECT e EXCEPT, além de expressões SELECT).

A Cláusula ORDER BY garante a ordem do ResultSet. A Cláusula FOR UPDATE torna o resultado um cursor atualizável. A instrução SELECT suporta a cláusula FOR FETCH ONLY. A cláusula FOR FETCH ONLY é sinônimo da cláusula FOR READ ONLY.

Para se obter um ResultSet atualizável, deve ser incluída a cláusula FOR UPDATE com a cláusula SELECT.
Sintaxe Consulta [Cláusula ORDER BY] [Cláusula FOR UPDATE] WITH {RR|RS|CS|UR}

Pode ser definido o nível de isolamento da instrução SELECT utilizando a sintaxe WITH {RR|RS|CS|UR}.

-- listar o nome da expressão SALÁRIO+BÔNUS+COMISS -- como PAGAMENTO_TOTAL, -- e ordenar pelo novo nome PAGAMENTO_TOTAL SELECT PRIMEIRO_NOME, SALÁRIO+BÔNUS+COMISS AS PAGAMENTO_TOTAL FROM EMPREGADOS ORDER BY PAGAMENTO_TOTAL; -- criar um cursor atualizável através da cláusula FOR UPDATE -- para atualizar as colunas data de início (PROJ_DATA_INÍCIO) e -- data de término (PROJ_DATA_FIM) da tabela PROJETO SELECT NUM_PROJ, PROJ_DATA_INÍCIO, PROJ_DATA_FIM FROM PROJETO FOR UPDATE OF PROJ_DATA_INÍCIO, PROJ_DATA_FIM; -- definir o nível de isolamento como RR apenas para esta instrução SELECT * FROM VÔOS WHERE ID_VÔO BETWEEN 'AA1111' AND 'AA1112' WITH RR;

A instrução SELECT retorna um ResultSet. O cursor é um ponteiro para uma linha específica do ResultSet. Nos aplicativos Java, todos os ResultSets são cursores. O cursor é atualizável, ou seja, podem ser atualizadas e excluídas linhas ao se caminhar através do ResultSet, se a instrução SELECT que gerou o cursor e sua consulta subjacente atenderem aos requisitos de poder ser atualizável, conforme detalhado abaixo. Deve ser utilizada a cláusula FOR UPDATE quando se deseja gerar um cursor atualizável. A cláusula ORDER BY permite ordenar os resultados do SELECT. Sem a cláusula ORDER BY, os resultados são retornados em ordem aleatória.

Se a instrução SELECT atender aos requisitos listados abaixo, os cursores serão atualizáveis apenas se for especificado FOR UPDATE na cláusula FOR (consulte a ).

Requisitos para cursores atualizáveis e ResultSets atualizáveis

Somente os cursores simples, com SELECT em uma única tabela, e os ResultSets FORWARD_ONLY, podem ser atualizáveis. A instrução SELECT para ResultSet atualizável possui a mesma sintaxe que a instrução SELECT para cursor atualizável. Para gerar cursores atualizáveis:

  • A instrução SELECT não pode incluir a cláusula ORDER BY.
  • A Consulta subjacente deve ser uma ExpressãoSeleção.
  • A ExpressãoSeleção da Consulta subjacente não pode incluir:
    • DISTINCT
    • Agregações
    • Cláusula GROUP BY
    • Cláusula HAVING
  • A cláusula FROM na Consulta subjacente não pode ter:
    • mais de uma tabela
    • qualquer outra coisa além de um nome de tabela
    • ExpressãoSeleção
    • subconsultas

Não existe instrução na linguagem SQL para atribuir nome a um cursor. Em vez disso, deve ser utilizada a API do JDBC para atribuir nomes a cursores ou obter os nomes gerados pelo sistema. Para obter mais informações, deve ser consultado "Atribuir nome ou acessar o nome do cursor" no capítulo 5 do .

Os cursores são apenas-de-leitura por padrão. Para um cursor ser atualizável, deve ser especificado FOR UPDATE na cláusula FOR (consulte a ).

Sistema de dependência de instrução

A instrução SELECT depende de todas as tabelas e visões especificadas na consulta, e dos conglomerados (unidades de armazenamento, como heaps e índices) escolhidos como caminho de acesso para estas tabelas. A instrução CREATE INDEX não invalida a instrução SELECT preparada. A instrução DROP INDEX invalida a instrução SELECT preparada, se o índice for um caminho de acesso na instrução. Quando o SELECT inclui visões, também depende dos objetos do dicionário dos quais as visões dependem (consulte a ).

Toda instrução UPDATE WHERE CURRENT ou DELETE WHERE CURRENT preparada sobre cursor de SELECT depende do SELECT. A remoção do SELECT através de uma instrução java.sql.Statement.close invalida UPDATE WHERE CURRENT e DELETE WHERE CURRENT.

O SELECT depende de todos os aliases utilizados na consulta. Remover um aliás invalida a instrução SELECT preparada, se a instrução utilizar o aliás.