Pergunta

Eu estou tentando se referir a um nome da coluna para pedir uma consulta em um aplicativo se comunicar com um banco de dados Oracle. Eu quero usar uma variável de ligação para que eu possa alterar dinamicamente o que pedir a consulta.

O problema que estou tendo é que o banco de dados parece estar ignorando a ordem por coluna.

Alguém sabe se existe uma maneira particular para se referir a uma coluna de banco de dados através de uma variável de ligação ou se é mesmo possível?

por exemplo a minha consulta é

SELECT * FROM PERSON ORDER BY :1

(onde :1 será obrigado a PERSON.NAME) A consulta não está retornando os resultados em ordem alfabética, estou preocupado que o banco de dados está interpretando isso como: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

que irá, obviamente, não trabalho.

Todas as sugestões são muito apreciados.

Foi útil?

Solução

No. Você não pode usar variáveis ??de ligação para nomes de tabelas ou colunas.

Esta informação é necessária para criar o plano de execução. Sem saber o que você quer a fim de, seria impossível descobrir o índice para utilização, por exemplo.

Em vez de variáveis ??de ligação, você tem que interpolar diretamente o nome da coluna na instrução SQL quando o programa cria. Supondo que você tomar precauções contra injeção de SQL, não há nenhuma desvantagem para isso.

Update: Se você realmente queria saltar através de aros, você provavelmente poderia fazer algo assim

order by decode(?, 'colA', colA, 'colB', colB)

mas isso é bobagem. E lento. não.

Outras dicas

Como você estiver usando JDBC. Você pode reescrever seu código, para algo sem variáveis ??de ligação. Desta forma, você também pode alterar dinamicamente o fim-by por exemplo:.

    String query = "SELECT * FROM PERS ";
    if (condition1){
      query = query+ " order by name ";
    // insert more if/else or case statements
    } else {
      query = query+ " order by other_column ";
    }
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery(query);

Ou mesmo

    String columnName = getColumnName(input);
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery("SELECT * FROM PERS ORDER BY "+columnName);

ResultSet resultado = select.executeQuery ( "SELECT * FROM PERS ORDER BY" + columnName);

será sempre uma nova declaração para o banco de dados. Isso significa que ele é, como Thilo já foi explicado, impossível "reordenar" um já vinculado, calculado, preparado, declaração analisado. Ao usar este conjunto de resultados mais e mais na sua aplicação e a única coisa que muda ao longo do tempo é a ordem da apresentação, tentar encomendar o conjunto em seu código de cliente. Caso contrário, SQL dinâmico é bom, mas vem com uma enorme pegada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top