sql >> Databáze >  >> RDS >> Mysql

Skripty SQL – Existuje ekvivalent #define?

C Pre Processor (cpp) je historicky spojen s C (odtud název), ale ve skutečnosti jde o obecný textový procesor, který lze použít (nebo zneužít) pro něco jiného.

Zvažte tento soubor s názvem location.src (o tom později).

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

a soubor debug.src, který je součástí:

#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

Při kompilaci s:

cpp -E location.src -o location.sql

získáte kód, který hledáte, s cpp rozšiřujícím hodnoty #define.

Při kompilaci s:

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

získáte totéž a navíc makro ASSERT (zveřejněné jako bonus, abyste ukázali, co mohlo hotovo).

Za předpokladu, že sestavení s HAVE_DEBUG nasazené v testovacím prostředí (ve verzi 5.5 nebo novější, protože se používá SIGNAL), výsledek vypadá takto:

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 ?

Všimněte si, jak název souboru, číslo řádku a podmínka ukazuje přímo na místo ve zdrojovém kódu v location.src, kde je vyvoláno tvrzení, opět díky C preprocesoru.

Nyní o příponě souboru ".src":

  • můžete použít cokoli.
  • Mít jinou příponu souboru pomáhá s makefiles atd. a zabraňuje zmatkům.

EDIT:Původně odesláno jako .xql, pro přehlednost přejmenováno na .src. Zde není nic, co by se týkalo xml dotazů.

Stejně jako u jiných nástrojů může použití cpp vést k dobrým věcem a případ použití pro údržbu LOCATION_LEN přenosným způsobem vypadá velmi rozumně. Může také vést ke špatným věcem, protože je příliš mnoho #include, vnořených #ifdef pekla, maker atd. že na konci kód zatemníte, takže vaše kilometry se mohou lišit.

S touto odpovědí získáte celou věc (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , možnosti příkazového řádku sestavit), takže doufám, že by to mělo pokrýt vše.



  1. Jak zabít běžící příkaz SELECT

  2. Dotaz Vyberte skupinu podle posledního znaku v poli

  3. Představujeme novou funkci – Spotlight Cloud Reports

  4. Oracle PL/SQL – kolekce (vnořené tabulky)