Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL скриптове - Съществува ли еквивалент на #define?

Предварителният процесор на C (cpp) исторически е свързан с C (оттук и името), но наистина е общ текстов процесор, който може да се използва (или злоупотребява) за нещо друго.

Помислете за този файл, наречен location.src (повече за това по-късно).

// 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 ;

и файл debug.src, който е включен:

#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

Когато се компилира с:

cpp -E location.src -o location.sql

получавате кода, който търсите, като cpp разширява #define стойности.

Когато се компилира с:

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

получавате същото, плюс макроса ASSERT (публикуван като бонус, за да покажете какво може да бъде направено).

Ако приемем компилация с HAVE_DEBUG, разгърната в тестова среда (в 5.5 или по-нова, тъй като се използва SIGNAL), резултатът изглежда така:

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 ?

Обърнете внимание как името на файла, номерът на реда и условието сочат точно на мястото в изходния код в location.src, където се издига assert, отново благодарение на предварителния процесор на C.

Сега относно разширението на файла ".src":

  • можете да използвате всичко.
  • Наличието на различно файлово разширение помага при make файлове и т.н. и предотвратява объркване.

РЕДАКТИРАНЕ:Първоначално публикувано като .xql, преименувано на .src за яснота. Тук няма нищо свързано с xml заявки.

Както при всички инструменти, използването на cpp може да доведе до добри неща и случаят на използване за поддържане на LOCATION_LEN по преносим начин изглежда много разумен. Може също да доведе до лоши неща, с твърде много #include, вложени #ifdef hell, макроси и т.н. които накрая замъгляват кода, така че пробегът ви може да варира.

С този отговор получавате цялата работа (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , опции на командния ред за изграждане), така че се надявам, че трябва да покрие всичко.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Модел за глобални настройки на Laravel

  2. Какво не е наред с тази mysql заявка?

  3. Как да планирате MySQL заявка?

  4. Значението на WHERE 1 в MySQL заявките

  5. Как да управлявате привилегии с роли в MySQL