Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एसक्यूएल स्क्रिप्ट - क्या #define के बराबर मौजूद है?

सी प्री प्रोसेसर (सीपीपी) ऐतिहासिक रूप से सी (इसलिए नाम) के साथ जुड़ा हुआ है, लेकिन यह वास्तव में एक सामान्य टेक्स्ट प्रोसेसर है जिसका उपयोग किसी और चीज के लिए किया जा सकता है (या दुरुपयोग)।

इस फ़ाइल पर विचार करें, जिसका नाम 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 मैक्रो (बोनस के रूप में पोस्ट किया जाता है, यह दिखाने के लिए कि क्या कर सकता है किया जा सकता है)।

एक परीक्षण वातावरण में तैनात HAVE_DEBUG के साथ एक निर्माण मानते हुए (5.5 में या बाद में SIGNAL का उपयोग किया जाता है), परिणाम इस तरह दिखता है:

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 ?

ध्यान दें कि फ़ाइल का नाम, लाइन नंबर, और कंडीशन कैसे लोकेशन.src में सोर्स कोड में सही जगह पर इंगित करता है, जहां एसेट को उठाया गया है, सी प्री प्रोसेसर के लिए फिर से धन्यवाद।

अब, ".src" फ़ाइल एक्सटेंशन के बारे में:

  • आप कुछ भी उपयोग कर सकते हैं।
  • एक अलग फ़ाइल एक्सटेंशन होने से मेकफ़ाइल आदि में मदद मिलती है, और भ्रम की स्थिति को रोकता है।

संपादित करें:मूल रूप से .xql के रूप में पोस्ट किया गया, स्पष्टता के लिए इसका नाम बदलकर .src कर दिया गया। यहां एक्सएमएल क्वेरी से संबंधित कुछ भी नहीं है।

किसी भी उपकरण की तरह, सीपीपी का उपयोग करने से अच्छी चीजें हो सकती हैं, और पोर्टेबल तरीके से LOCATION_LEN को बनाए रखने के लिए उपयोग का मामला बहुत ही उचित लगता है। यह बहुत से #include, नेस्टेड #ifdef नरक, मैक्रोज़ आदि के साथ खराब चीजें भी पैदा कर सकता है। कि अंत में कोड को अस्पष्ट कर दें, ताकि आपका माइलेज भिन्न हो सके।

इस उत्तर से, आपको पूरी चीज़ मिल जाती है (#define , #include , #ifdef , __FILE__ , __LINE__ , #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. नोड डेटाबेस कॉल को हटाना

  2. एकाधिक तालिकाओं के साथ MySQL क्वेरी

  3. MySQL प्रतिलिपि पंक्तियों को उसी तालिका में कुंजी मान के साथ बदल दिया गया है (मौजूदा ओवरराइटिंग नहीं)

  4. Mysql ने auto_increment कॉलम को अस्थायी रूप से संग्रहीत प्रक्रिया में अक्षम कर दिया

  5. एकाधिक कॉलम पर FULLTEXT INDEXES कैसे काम करते हैं?