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

Skrip SQL - Apakah yang setara dengan #define ada?

C Pre Processor (cpp) secara historis dikaitkan dengan C (oleh karena itu namanya), tetapi sebenarnya adalah prosesor teks generik yang dapat digunakan (atau disalahgunakan) untuk hal lain.

Pertimbangkan file ini, bernama location.src (lebih lanjut tentang itu nanti).

// C++ style comments works here
/* C style works also */
-- plain old SQL comments also work,
-- but you should avoid using '#' style of comments,
-- this will confuse the C pre-processor ...

#define LOCATION_LEN 25

/* Debug helper macro */
#include "debug.src"

DROP TABLE IF EXISTS test.locations;
CREATE TABLE test.locations
(
   `location` VARCHAR(LOCATION_LEN) NOT NULL
);

DROP PROCEDURE IF EXISTS test.AddLocation;
delimiter $$
CREATE PROCEDURE test.AddLocation (IN location VARCHAR(LOCATION_LEN))
BEGIN
  -- example of macro
  ASSERT(length(location) > 0, "lost or something ?");

  -- do something
  select "Hi there.";
END
$$

delimiter ;

dan file debug.src, yang disertakan:

#ifdef HAVE_DEBUG
#define ASSERT(C, T)                                          \
  begin                                                       \
    if (not (C)) then                                         \
      begin                                                   \
        declare my_msg varchar(1000);                         \
        set my_msg = concat("Assert failed, file:", __FILE__, \
                            ", line: ", __LINE__,             \
                            ", condition ", #C,               \
                            ", text: ", T);                   \
        signal sqlstate "HY000" set message_text = my_msg;    \
     end;                                                     \
    end if;                                                   \
  end
#else
#define ASSERT(C, T) begin end
#endif

Saat dikompilasi dengan:

cpp -E location.src -o location.sql

Anda mendapatkan kode yang Anda cari, dengan cpp memperluas nilai #define.

Saat dikompilasi dengan:

cpp -E -DHAVE_DEBUG location.src -o location.sql

Anda mendapatkan yang sama, ditambah makro ASSERT (diposting sebagai bonus, untuk menunjukkan apa yang bisa dilakukan).

Dengan asumsi build dengan HAVE_DEBUG di-deploy di lingkungan pengujian (dalam 5.5 atau lebih baru sejak SIGNAL digunakan), hasilnya terlihat seperti ini:

mysql> call AddLocation("Here");
+-----------+
| Hi there. |
+-----------+
| Hi there. |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call AddLocation("");
ERROR 1644 (HY000): Assert failed, file:location.src, line: 24, condition length(location) > 0, text: lost or something ?

Perhatikan bagaimana nama file, nomor baris, dan kondisi menunjuk tepat di tempat dalam kode sumber di location.src tempat pernyataan dimunculkan, sekali lagi terima kasih kepada prosesor awal C.

Sekarang, tentang ekstensi file ".src":

  • Anda dapat menggunakan apa saja.
  • Memiliki ekstensi file yang berbeda membantu dengan makefile, dll, dan mencegah kebingungan.

EDIT:Awalnya diposting sebagai .xql, diganti namanya menjadi .src untuk kejelasan. Tidak ada yang terkait dengan kueri xml di sini.

Seperti halnya alat apa pun, menggunakan cpp dapat menghasilkan hal-hal yang baik, dan kasus penggunaan untuk mempertahankan LOCATION_LEN dengan cara portabel terlihat sangat masuk akal. Itu juga dapat menyebabkan hal-hal buruk, dengan terlalu banyak #include, #ifdef hell bersarang, makro, dll yang pada akhirnya mengaburkan kode, sehingga jarak tempuh Anda mungkin berbeda.

Dengan jawaban ini, Anda mendapatkan semuanya (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , opsi baris perintah untuk dibuat), jadi saya harap ini mencakup semuanya.



  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 Memasukkan kumpulan data besar dari file dengan Java

  2. Bash Script Loop Melalui MySQL

  3. Kolasi Case Sensitive di MySQL

  4. LocalDateTime , ZonedDateTime dan Timestamp

  5. Mengapa kueri tidak gagal dengan kolom yang tidak ada di subkueri?