Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Skrypty SQL — czy istnieje odpowiednik #define?

Preprocesor C (cpp) jest historycznie powiązany z C (stąd nazwa), ale tak naprawdę jest to ogólny procesor tekstu, którego można używać (lub nadużywać) do czegoś innego.

Rozważ ten plik o nazwie location.src (więcej o tym później).

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

oraz plik debug.src, który jest dołączony:

#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

Po skompilowaniu z:

cpp -E location.src -o location.sql

otrzymujesz kod, którego szukasz, z cpp rozwijającym #define wartości.

Po skompilowaniu z:

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

otrzymujesz to samo, plus makro ASSERT (opublikowane jako bonus, aby pokazać, co może być gotowe).

Zakładając, że kompilacja z HAVE_DEBUG została wdrożona w środowisku testowym (w wersji 5.5 lub nowszej od czasu użycia SIGNAL), wynik wygląda tak:

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 ?

Zwróć uwagę, że nazwa pliku, numer wiersza i warunek wskazują dokładnie to miejsce w kodzie źródłowym w location.src, gdzie zgłoszono potwierdzenie, ponownie dzięki preprocesorowi C.

Teraz o rozszerzeniu pliku „.src”:

  • możesz użyć wszystkiego.
  • Posiadanie innego rozszerzenia pliku pomaga w plikach makefile itp. i zapobiega pomyłkom.

EDYCJA:Pierwotnie opublikowany jako .xql, dla jasności zmieniono jego nazwę na .src. Nie ma tu nic związanego z zapytaniami xml.

Podobnie jak w przypadku innych narzędzi, używanie cpp może prowadzić do dobrych rzeczy, a zastosowanie obsługi LOCATION_LEN w sposób przenośny wygląda bardzo rozsądnie. Może również prowadzić do złych rzeczy, ze zbyt wieloma #include, zagnieżdżonymi #ifdef hell, makrami itp. które na końcu zaciemniają kod, więc Twój przebieg może się różnić.

Dzięki tej odpowiedzi otrzymasz wszystko (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , opcje wiersza poleceń do zbudowania), więc mam nadzieję, że powinno to wszystko wyjaśnić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO::query a PDOStatement::execute (PHP i MySQL)

  2. PDOException „nie można znaleźć sterownika” w php

  3. wyszukiwanie danych między datami przechowywanymi w varchar w mysql

  4. Wybór MySQL według najnowszego znacznika czasu

  5. mysql aktualizuje kolumnę o int na podstawie zamówienia