Jeśli jest to przygotowana instrukcja i jest to wartość powiązania podana w ORDER BY
klauzula, która jest ważna, ALE...
Podana wartość wiązania nie będzie interpretowana jako tekst SQL. Oznacza to, że wartość będzie postrzegana jako zwykła wartość (jak dosłowny ciąg znaków). Nie będzie widoczny jako nazwa kolumny ani ASC
lub DESC
słowo kluczowe.
W kontekście Twojego oświadczenia, podaj wartość :orderClause
bind placeholder, będzie miał taki sam efekt, jak gdybyś napisał ORDER BY 'some literal'
.
I to wcale nie powoduje żadnej kolejności wierszy.
(Jest to prawda przynajmniej w każdej bibliotece klienta SQL, której używałem z DB2, Teradata, Oracle, SQL Server, MySQL i MariaDB (JDBC, Perl DBI, ODBC, Pro/C, i in.)
(MyBatis zapewnia wygodny mechanizm podstawiania zmiennych w tekście SQL, dynamicznie zmieniający tekst SQL przed jego przygotowaniem, ale te podstawienia są obsługiwane PRZED przygotowaniem instrukcji i nie zamieniają się w symbole zastępcze wiązania w instrukcji.)
Możliwe jest uzyskanie odrobiny „dynamicznego” porządkowania za pomocą starannie przygotowanych wyrażeń w klauzuli ORDER BY. Na przykład, nasz statyczny tekst SQL może wyglądać tak:
ORDER BY CASE WHEN :sort_param = 'name ASC' THEN activation_name END ASC
, CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC
(Tekst SQL nie jest tutaj dynamiczny, w rzeczywistości jest statyczny, to tak, jakbyśmy pisali.
ORDER BY expr1 ASC
, expr1 DESC
Sztuczka polega na tym, że wyrażenia w klauzuli ORDER BY warunkowo zwracają albo wartość jakiejś kolumny z każdego wiersza, albo zwracają literał (w powyższym przykładzie literał NULL), w zależności od wartości powiązania wartość, oceniana w czasie wykonania.
Efekt netto polega na tym, że możemy „dynamicznie” uzyskać efekt:
ORDER BY activation_name ASC, NULL DESC
lub
ORDER BY NULL ASC, activation_name DESC
lub
ORDER BY NULL ASC, NULL DESC
w zależności od tego, jaką wartość dostarczamy dla symbolu zastępczego :sort_param.