sql >> Database teknologi >  >> RDS >> Mysql

SQL-scripts - Findes der det, der svarer til en #define?

C Pre Processor (cpp) er historisk forbundet med C (deraf navnet), men det er virkelig en generisk tekstprocessor, der kan bruges (eller misbruges) til noget andet.

Overvej denne fil med navnet location.src (mere om det senere).

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

og filen debug.src, som er inkluderet:

#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

Når det er kompileret med:

cpp -E location.src -o location.sql

du får den kode, du leder efter, med cpp udvidende #define værdier.

Når det er kompileret med:

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

du får det samme, plus ASSERT-makroen (indsendt som en bonus, for at vise hvad kunne gøres).

Forudsat en build med HAVE_DEBUG installeret i et testmiljø (i 5.5 eller nyere, da SIGNAL bruges), ser resultatet sådan ud:

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 ?

Bemærk, hvordan filnavnet, linjenummeret og tilstanden peger lige på det sted i kildekoden i location.src, hvor angivelsen er rejst, igen takket være C-forbehandleren.

Nu om filtypen ".src":

  • du kan bruge hvad som helst.
  • At have en anden filtypenavn hjælper med make-filer osv. og forhindrer forvirring.

EDIT:Oprindeligt postet som .xql, omdøbt til .src for klarhedens skyld. Intet relateret til xml-forespørgsler her.

Som med alle værktøjer kan brug af cpp føre til gode ting, og brugssagen til at vedligeholde LOCATION_LEN på en bærbar måde ser meget fornuftig ud. Det kan også føre til dårlige ting, med for mange #include, indlejrede #ifdef helvede, makroer osv. at til sidst slører koden, så dit kilometertal kan variere.

Med dette svar får du det hele (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , kommandolinjeindstillinger at bygge), så jeg håber, det skal dække det hele.



  1. gem install pg virker ikke på OSX Lion

  2. Trin for trin opgraderingsproces for R12.2 Upgrade Part -4 (anvender 12.2.x Release Update Pack)

  3. MySQL-indekser og rækkefølge

  4. Android til Wamp-serverforbindelse ved hjælp af Android Studio og PHP