Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySql menyiapkan pernyataan - apakah mungkin untuk memparametrikan nama kolom atau nama fungsi?

Anda tidak bisa parametrize kolom/tabel/nama fungsi/alias. Sebagai, PREPARE pernyataan hanya mengizinkan bagian "nilai" dari kueri SQL untuk digunakan sebagai parameter. Fungsi/Tabel/Nama kolom/alias digunakan untuk menentukan validitas pernyataan SQL; dan dengan demikian tidak dapat diubah selama eksekusi run-time. Mengubahnya pada waktu eksekusi berpotensi mengubah apakah pernyataan SQL itu valid.

Anda dapat menganggapnya sebagai kompilasi kode; maka kompiler harus mengetahui semua fungsi/nama kelas dll untuk membuat executable yang valid (ya, kita dapat melakukan kelas dinamis, tetapi itu jarang ). Di sisi lain, kita dapat mengubah input "nilai" ke program, tetapi umumnya tidak bisa ubah operasi yang akan dilakukan pada data input.

Selain itu, server MySQL akan mempertimbangkan parameter sebagai literal, dan menerapkan tanda kutip di sekitarnya, sebelum menggunakannya dalam eksekusi kueri.

Sekarang, dalam kasus Anda, Anda masih dapat menggunakan nama fungsi sebagai parameter untuk prosedur Tersimpan, dan menghasilkan string kueri menggunakan itu. Tetapi Anda tidak dapat menggunakannya sebagai parameter untuk kueri itu sendiri.

delimiter $$
create procedure test(in func varchar(20), in col varchar(20))
  begin

    set @c = col;

    -- use concat function to generate the query string using func parameter
    set @sql = concat('select ', func, '(?) from table');

    -- prepare the statement
    prepare stmt from @sql;

    -- execute
    execute x using @c;

    -- don't forget to deallocate the prepared statement
    deallocate prepare stmt;
  end$$
delimiter ;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql mendapatkan last_insert_id() di pemicu

  2. Skrip SQL - Apakah yang setara dengan #define ada?

  3. MySQL SELECT x FROM a WHERE NOT IN ( SELECT x FROM b ) - Hasil tak terduga

  4. Menonaktifkan PDO::ATTR_EMULATE_PREPARES menyebabkan masalah 'tidak diketahui'

  5. Permintaan MySQL yang menghitung jumlah parsial