Jika itu adalah pernyataan yang disiapkan, dan itu adalah nilai pengikatan yang diberikan dalam ORDER BY
klausa, yang valid, TAPI...
Nilai bind yang diberikan tidak akan ditafsirkan sebagai teks SQL. Artinya, nilai akan terlihat hanya sebagai nilai (seperti string literal). Itu tidak akan terlihat sebagai nama kolom, atau ASC
atau DESC
kata kunci.
Dalam konteks pernyataan Anda, berikan nilai untuk :orderClause
bind placeholder, itu akan memiliki efek yang sama seperti jika Anda telah menulis ORDER BY 'some literal'
.
Dan itu sama sekali tidak melakukan pengurutan baris.
(Ini berlaku setidaknya di setiap pustaka klien SQL yang saya gunakan dengan DB2, Teradata, Oracle, SQL Server, MySQL, dan MariaDB (JDBC, Perl DBI, ODBC, Pro/C, dkk.)
(MyBatis memang menyediakan mekanisme yang nyaman untuk melakukan substitusi variabel dalam teks SQL, secara dinamis mengubah teks SQL sebelum disiapkan, tetapi substitusi tersebut ditangani SEBELUM pernyataan disiapkan, dan tidak berubah menjadi pengikat tempat penampung dalam pernyataan.)
Dimungkinkan untuk mendapatkan sedikit pemesanan "dinamis" dengan beberapa ekspresi yang dibuat dengan hati-hati dalam klausa ORDER BY. Misalnya, kita dapat membuat teks SQL statis kita menjadi seperti ini:
ORDER BY CASE WHEN :sort_param = 'name ASC' THEN activation_name END ASC
, CASE WHEN :sort_param = 'name DESC' THEN activation_name END DESC
(Teks SQL di sini tidak dinamis, sebenarnya statis, seolah-olah kita telah menulis.
ORDER BY expr1 ASC
, expr1 DESC
"Trik"nya adalah bahwa ekspresi dalam klausa ORDER BY secara kondisional mengembalikan nilai beberapa kolom dari setiap baris, atau mereka mengembalikan literal (dalam contoh di atas, literal NULL), tergantung pada nilai bind nilai, dievaluasi pada waktu eksekusi.
Efek bersihnya adalah kita bisa "secara dinamis" mendapatkan efek dari:
ORDER BY activation_name ASC, NULL DESC
atau
ORDER BY NULL ASC, activation_name DESC
atau
ORDER BY NULL ASC, NULL DESC
tergantung pada nilai yang kami berikan untuk :sort_param placeholder.