Ако това е подготвен израз и това е стойност за обвързване, която се предоставя в ORDER BY
клауза, това е валидно, НО...
Предоставената стойност на свързване няма да се интерпретира като SQL текст. Тоест стойността ще се разглежда просто като стойност (като литерал низ). Няма да се вижда като име на колона или ASC
или DESC
ключова дума.
В контекста на вашето изявление предоставяне на стойност за :orderClause
bind placeholder, това ще има същия ефект, както ако сте написали ORDER BY 'some literal'
.
И това всъщност изобщо не прави никакво подреждане на редовете.
(Това е вярно поне във всяка SQL клиентска библиотека, която съм използвал с DB2, Teradata, Oracle, SQL Server, MySQL и MariaDB (JDBC, Perl DBI, ODBC, Pro/C и др.)
(MyBatis предоставя удобен механизъм за извършване на заместване на променлива в SQL текста, като динамично променя SQL текста, преди да бъде подготвен, но тези замествания се обработват ПРЕДИ операторът да бъде подготвен и не се превръщат в контейнери за свързване в оператора.)
Възможно е да получите малко "динамично" подреждане с някои внимателно изработени изрази в клаузата ORDER BY. Например, можем да направим нашия статичен SQL текст нещо подобно:
ORDER BY CASE WHEN :sort_param = 'name ASC' THEN activation_name END ASC
, CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC
(Тук SQL текстът не е динамичен, всъщност е статичен, все едно сме го написали.
ORDER BY expr1 ASC
, expr1 DESC
„Номерът“ е, че изразите в клаузата ORDER BY условно връщат или стойността на някаква колона от всеки ред, или връщат литерал (в примера по-горе, литерала NULL), в зависимост от стойността на свързване стойност, оценена по време на изпълнение.
Нетният ефект е, че можем "динамично" да получим ефекта от едно от двете:
ORDER BY activation_name ASC, NULL DESC
или
ORDER BY NULL ASC, activation_name DESC
или
ORDER BY NULL ASC, NULL DESC
в зависимост от това каква стойност предоставяме за контейнера :sort_param.