Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tập lệnh SQL - Tương đương với #define có tồn tại không?

Bộ xử lý tiền C (cpp) được liên kết lịch sử với C (do đó có tên), nhưng nó thực sự là một bộ xử lý văn bản chung có thể được sử dụng (hoặc lạm dụng) cho việc khác.

Hãy xem xét tệp này, có tên location.src (sẽ tìm hiểu thêm về tệp này sau).

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

và tệp debug.src, được bao gồm:

#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

Khi được biên dịch với:

cpp -E location.src -o location.sql

bạn nhận được mã bạn đang tìm kiếm, với cpp mở rộng các giá trị #define.

Khi được biên dịch với:

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

bạn nhận được điều tương tự, cộng với macro ASSERT (được đăng dưới dạng phần thưởng, để hiển thị những gì có thể được thực hiện).

Giả sử một bản dựng với OF_DEBUG được triển khai trong môi trường thử nghiệm (trong phiên bản 5.5 trở lên kể từ khi SIGNAL được sử dụng), kết quả sẽ giống như sau:

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 ?

Lưu ý cách tên tệp, số dòng và điều kiện trỏ ngay tại vị trí trong mã nguồn trong location.src nơi xác nhận được nêu ra, một lần nữa cảm ơn bộ xử lý trước C.

Bây giờ, về phần mở rộng tệp ".src":

  • bạn có thể sử dụng bất kỳ thứ gì.
  • Việc có một phần mở rộng tệp khác sẽ giúp ích cho việc trang điểm, v.v. và tránh nhầm lẫn.

EDIT:Ban đầu được đăng là .xql, đổi tên thành .src cho rõ ràng. Không có gì liên quan đến truy vấn xml ở đây.

Như với bất kỳ công cụ nào, việc sử dụng cpp có thể dẫn đến những điều tốt đẹp và trường hợp sử dụng để duy trì LOCATION_LEN theo cách di động có vẻ rất hợp lý. Nó cũng có thể dẫn đến những điều tồi tệ, với quá nhiều #include, #ifdef hell lồng nhau, macro, v.v. rằng cuối cùng làm xáo trộn mã, vì vậy số dặm của bạn có thể thay đổi.

Với câu trả lời này, bạn sẽ có được toàn bộ (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , tùy chọn dòng lệnh để xây dựng), vì vậy tôi hy vọng nó sẽ bao gồm tất 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. Trả về 0 nếu trường rỗng trong MySQL

  2. Kiểu dữ liệu mảng DC2Type trong mysql là gì

  3. Chạy AMP (apache mysql php) trên Android

  4. Cách cập nhật lại cột id bắt đầu từ 1

  5. Truy vấn cập nhật MySQL với tham gia bên trái và nhóm theo