我有一个脚本,可以用来构造表和存储过程。例如,我有一个类型为的列varchar
。varchar
需要一个size参数,该大小我也用作存储过程以及这些过程中的参数。
是否有可能具有a的等价形式#define
,因此我可以轻松调整大小而无需在整个脚本中进行更改?
我正在使用MySql工作台。
编辑
我曾尝试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。这里与html" target="_blank">xml查询无关。
与使用任何工具一样,使用cpp可以带来很多好处,并且以可移植的方式维护LOCATION_LEN的用例看起来非常合理。它也可能导致不好的事情,因为太多的#include,嵌套的#ifdef
hell,宏等最终会使代码模糊不清,因此您的工作量可能会有所不同。
有了这个答案,你会得到整个事情(#define
,#include
,#ifdef
,__FILE__
,__LINE__
,#C
,命令行选项来编译),所以我希望它应该涵盖一切。
添加日志语句后,getViewType似乎只接收到0的位置。这导致onCreateView只加载一个布局: 加载CommentFragment的片段转换: 片段的OnCreateView: 适配器代码(感谢hister让我开始): 使用上面的代码,只显示头布局,因为viewType始终为0。看起来是这样的。如果我强制另一个布局,它看起来如下所示:
问题内容: 我有两个对象,想要将它们配对,就像Python中的函数一样。我很确定JDK中没有此功能,但是在相当广泛的库中是否有类似Apache通用收藏集的类似内容?谢谢。 问题答案: 功能Java具有,以及您对Haskell或Scala的期望。(实际上,作者几乎都是Haskell程序员。)
我是MySQL的新手。我有以下SQL查询,并尝试转换为mysql,为表create脚本中的日期列提供默认值。 但在MySQL中不支持。获取以下错误。 错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以了解第1行“(-1),sysutcdatetime())”附近使用的正确语法 此外,我还需要以以下格式获取日期'9999-12-31 23:59:59.99999
问题内容: 一些数据库支持以下命令: 本质上,我需要提取前10条记录,然后提取10条记录,然后提取10条记录,等等。也许有另一种方式可以做到这一点,但是在过去,对于支持“ START AT”的数据库,我已经像上面那样完成了。 问题答案: 哪个版本的SQL Server? 在SQL Server 2000中,这确实是一个痛苦(尽管可以使用诸如stingyjack发布的丑陋技巧)。 在2005年及之后
问题内容: 将几个存储过程从MySQL转换为Microsoft SQL Server。一切都进行得很好,除了一个过程使用了MySQL函数。我似乎无法在MS-SQL中找到与之等效的东西。 有谁知道在MS-SQL上的有效等效项? 问题答案: SQL Server 2005和更高版本具有HashBytes()函数。
问题内容: 我想用。像这样从存储的过程中调用sql脚本… 我收到“无法打开’test.sql;’的消息” 我以这种方式运行时出错。我也尝试过!但随后出现权限被拒绝错误。但是,我无法消除;; 或整个事情坏了。有没有解决的办法? 我究竟做错了什么? 问题答案: mysql客户端内置了一组命令。它们记录在“ 命令 ” 下。这些包括DELIMITER,SOURCE,HELP,CONNECT,USE,QUI