Se for uma instrução preparada e for um valor de ligação fornecido no
ORDER BY
cláusula, isso é válido, MAS... O valor de ligação fornecido não será interpretado como texto SQL. Ou seja, o valor será visto apenas como um valor (como uma string literal). Não será visto como um nome de coluna ou um
ASC
ou DESC
palavra-chave. No contexto de sua instrução, fornecendo um valor para o
:orderClause
bind placeholder, isso terá o mesmo efeito como se você tivesse escrito ORDER BY 'some literal'
. E isso não está realmente fazendo nenhuma ordenação das linhas.
(Isso é verdade pelo menos em todas as bibliotecas de cliente SQL que usei com DB2, Teradata, Oracle, SQL Server, MySQL e MariaDB (JDBC, Perl DBI, ODBC, Pro/C, et al.)
(O MyBatis fornece um mecanismo conveniente para fazer a substituição de variáveis no texto SQL, alterando dinamicamente o texto SQL antes de ser preparado, mas essas substituições são tratadas ANTES de a instrução ser preparada e não se transformam em espaços reservados de vinculação na instrução.)
É possível obter um mínimo de ordenação "dinâmica" com algumas expressões cuidadosamente elaboradas na cláusula ORDER BY. Por exemplo, podemos fazer com que nosso texto SQL estático seja algo assim:
ORDER BY CASE WHEN :sort_param = 'name ASC' THEN activation_name END ASC
, CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC
(O texto SQL aqui não é dinâmico, na verdade é estático, é como se tivéssemos escrito.
ORDER BY expr1 ASC
, expr1 DESC
O "truque" é que as expressões na cláusula ORDER BY estão retornando condicionalmente o valor de alguma coluna de cada linha ou estão retornando um literal (no exemplo acima, o literal NULL), dependendo do valor de uma ligação valor, avaliado em tempo de execução.
O efeito líquido é que podemos "dinamicamente" obter o efeito de:
ORDER BY activation_name ASC, NULL DESC
ou
ORDER BY NULL ASC, activation_name DESC
ou
ORDER BY NULL ASC, NULL DESC
dependendo do valor que fornecemos para o espaço reservado :sort_param.