我有一个脚本,可以用来构造表和存储过程。例如,我有一个类型为的列varchar。varchar需要一个size参数,该大小我也用作存储过程以及这些过程中的参数。
varchar
是否有可能具有a的等价形式#define,因此我可以轻松调整大小而无需在整个脚本中进行更改?
#define
我正在使用MySql工作台。
编辑
我曾尝试SET和DECLARE
SET
DECLARE
我有一个脚本-这是(删节的)
CREATE TABLE `locations` ( `location` VARCHAR(25) NOT NULL ); ... CREATE PROCEDURE AddLocation (IN location VARCHAR(25) BEGIN ... END$$
我想要实现的是用一个 常量 替换脚本中的值25-类似于#define创建表和存储过程的脚本顶部的a ,因此我能够轻松地将25更改为另一个数字。
有人找到解决这个问题的办法了吗?
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宏(作为奖励发布,以显示 可以 完成的操作)。
假设在测试环境中部署了具有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 ?
注意文件名,行号和条件如何直接指向源代码中location.src中引发断言的位置,这再次感谢C预处理器。
现在,关于“ .src”文件扩展名:
编辑:最初发布为.xql,为清楚起见,更名为.src。这里与xml查询无关。
与使用任何工具一样,使用cpp可以带来很多好处,并且以可移植的方式维护LOCATION_LEN的用例看起来非常合理。它也可能导致不好的事情,因为太多的#include,嵌套的#ifdef hell,宏等最终会使代码模糊不清,因此您的工作量可能会有所不同。
有了这个答案,你会得到整个事情(#define,#include,#ifdef,__FILE__,__LINE__,#C,命令行选项来编译),所以我希望它应该涵盖一切。
#include
#ifdef
__FILE__
__LINE__
#C