数据库部分
假设有如下table:
id | name | point | point2 | mtime |
---|---|---|---|---|
1 | AA | 50 | 52 | 2019-6-28 10:10:10 |
2 | BB | 80 | 60 | 2019-6-27 10:10:17 |
对应SQL:
CREATE TABLE `tab1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) DEFAULT NULL,
`point` int(11) NOT NULL DEFAULT '0',
`point2` int(11) NOT NULL DEFAULT '0',
`mtime` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
1. 在结果集里比较两个字段返回较大的
初次实现多数人会想到max()函数,但要注意max是聚合函数,要配合group by来使用; 现在我只想比较point和point2的大小; 此时应该使用greatest/least。
SELECT `name`,GREATEST(`point`,`point2`) FROM tab1;
结论
greatest(字段1,字段2,..,字段n) 取最大值
least(字段1,字段2,…,字段n) 取最小值
注意
当greatest里参数中只要有一个是null,则返回null, least也是; 如果想避免返回null则可以使用if语句规避。
2. 从select结果中创建临时表
在存储过程中创建临时表,最常用是
create temporary table tmp_table ( f1 varchar(5), f2 int )
然之后insert into tmp_tab select x,y from tab1
这种形式; 其实可以整合到一个语句完成。
create temporary table tmp_table select x,y from tab1
3. 存储过程里通过名字(字符串)去调用别的存储过程
直接提供示例sql
DELIMITER $$
USE `dbName`$$
DROP PROCEDURE IF EXISTS `sp1`$$
CREATE DEFINER=`root`@`%` PROCEDURE `sp1`(
procName VARCHAR(64),
lastTime DATETIME,
idBeg LONG,
idEnd LONG,
cityid VARCHAR(16)
)
BEGIN
DECLARE sql_stmt VARCHAR(500);
SET sql_stmt=CONCAT("call ", procName, "('" , lastTime, "',", idBeg, ",", idEnd, ",'", cityid, "'", ")");
SET @sqlstmt= sql_stmt;
PREPARE sqlstr1 FROM @sqlstmt;
EXECUTE sqlstr1;
DEALLOCATE PREPARE sqlstr1;
END$$
DELIMITER ;
4. 存储过程返回时间格式到java
正常来说数据库的字段类型是datetime,就可以对应到java里的Date类型; 但是当select返回的时间是经过处理的就要注意,返回可能会变成字符串。 譬如
SELECT
name,GREATEST(mtime,'0') FROM tab1
这时候java程序用Date变量去接收有可能出错; 可以用过下面示例解决
## 下面语句要在存储过程中才能用
DECLARE minDatetime DATETIME DEFAULT 0;
SELECT `name`,GREATEST(mtime,minDatetime) FROM tab1;
FTP
开发过程遇到FTPClient MalformedServerReplyException: Truncated server reply: ‘220 ‘
经查error code,220是正常码;
本人用的ftp客户端是org.apache.commons.net.ftp.FTPClient, 解决办法是
登录前调用一次ftpClient.setStrictReplyParsing(false);
理由是对于不是ftps协议的明文ftp,可能认为不安全,这时候setStrictReplyParsing(false)不使用严格响应规则,就不会发生异常了。本人简单封装的ftp客户端在另一文章发出,有需要的朋友可参考。