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マクロ(ボーナスとして投稿され、何ができるかを示す)を取得します 行われる)。

    テスト環境(SIGNALが使用されているため5.5以降)にHAVE_DEBUGがデプロイされたビルドを想定すると、結果は次のようになります。

    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 ?
    

    ファイル名、行番号、および条件が、Cプリプロセッサのおかげでassertが発生するlocation.srcのソースコード内の場所を指していることに注意してください。

    さて、「。src」ファイル拡張子について:

    • 何でも使用できます。
    • 別のファイル拡張子を使用すると、makefileなどに役立ち、混乱を防ぐことができます。

    編集:元々は.xqlとして投稿されていましたが、わかりやすくするために.srcに名前が変更されました。ここではxmlクエリに関連するものはありません。

    他のツールと同様に、cppを使用すると良い結果が得られ、LOCATION_LENを移植可能な方法で維持するためのユースケースは非常に合理的に見えます。また、#include、ネストされた#ifdef hell、マクロなどが多すぎると、悪い結果につながる可能性があります。最後にコードがわかりにくくなるため、マイレージが異なる場合があります。

    この答えで、あなたはすべてを手に入れます(#define#include#ifdef__FILE____LINE__#C 、ビルドするコマンドラインオプション)なので、すべてをカバーする必要があります。



    1. パージしないことの価格

    2. SQL Serverで(decimal、float、int)に変換できないフィールド値を判別する方法

    3. 主キーを無視してSQLServerで重複する行を見つける7つの方法

    4. OracleのLENGTH()関数