MYSQL在函数不能用SELECT语句?

gungod 2011-03-17 03:19:06
MYSQL在函数不能用
SELECT 变量 = tbl_filed FORM tbl
的语句吗?

如下:

DROP FUNCTION IF EXISTS fn_name;
delimiter //
CREATE FUNCTION fn_name (DailyDate DATETIME,returntype SMALLINT)
RETURNS DECIMAL(18, 1)
BEGIN
DECLARE BDate DATETIME;
DECLARE qty_return DECIMAL(18, 1); DECLARE `MaxValue` DECIMAL(18, 1); DECLARE `MinValue` DECIMAL(18, 1);
SET qty_return = 0;
SELECT `MaxValue` = ROUND(IFNULL(MAX(Airtemp),0),1) , `MinValue` = ROUND(IFNULL(MIN(Airtemp),0),1)
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateTime < DATE_ADD(BDate, INTERVAL '1 0:5' DAY_MINUTE);

IF (returntype = 0) THEN SET qty_return = `MinValue` ; ELSEIF (returntype = 1) THEN SET qty_return = `MaxValue`; END IF; RETURN qty_return; END//
delimiter ;


当去掉

SELECT `MaxValue` = ROUND(IFNULL(MAX(Airtemp),0),1) , `MinValue` = ROUND(IFNULL(MIN(Airtemp),0),1)
FROM hy_tmpr_c WHERE SingInDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND SingInDateTime < DATE_ADD(BDate, INTERVAL '1 0:5' DAY_MINUTE);

编译就通过了,否则出现错误提示:
"Not allowed to return a result set from a from"

但是这句才是这个函数的主要功能,怎么办?
...全文
407 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gungod 2011-03-21
  • 打赏
  • 举报
回复
不用 := 这个操作符,
运行不成功的。
gungod 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 acmain_chm 的回复:]
引用9.3. 用户变量
可以先在用户变量中保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。用户变量与连接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。

用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和‘$’组成。 默认字符集是cp1252 (La……
[/Quote]

用户变量的形式为@var_name,
必须加@吗?

是不是如果没用@,执行FUNCTION 返回出来的标值就为NULL?
ACMAIN_CHM 2011-03-17
  • 打赏
  • 举报
回复
[Quote]9.3. 用户变量
可以先在用户变量中保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。用户变量与连接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。

用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和‘$’组成。 默认字符集是cp1252 (Latin1)。可以用mysqld的--default-character-set选项更改字符集。参见5.10.1节,“数据和排序用字符集”。用户变量名对大小写不敏感。

设置用户变量的一个途径是执行SET语句:

SET @var_name = expr [, @var_name = expr] ...
对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。

也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
用户变量可以用于表达式中。目前不包括明显需要文字值的上下文中,例如SELECT语句的LIMIT子句,或者LOAD DATA语句的IGNORE number LINES子句。

如果使用没有初始化的变量,其值是NULL。

[/Quote]
wwwwb 2011-03-17
  • 打赏
  • 举报
回复
在MYSQL SELECT中变量赋值
SELECT `MaxValue` := ROUND(IFNULL(MAX(Airtemp),0),1) , `MinValue`:= ROUND(IFNULL(MIN(Airtemp),0),1)
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateTime < DATE_ADD(BDate, INTERVAL '1 0:5' DAY_MINUTE);
gungod 2011-03-17
  • 打赏
  • 举报
回复
:= 这个操作符,貌似pascal的赋值运算符。
ACMAIN_CHM 2011-03-17
  • 打赏
  • 举报
回复
SELECT 变量 := tbl_filed FORM tbl
或者
SELECT tbl_filed into 变量 FORM tbl
gungod 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwb 的回复:]
引用 2 楼 gungod 的回复:
引用 1 楼 wwwwb 的回复:
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL ……
[/Quote]

我格式出错了,哎。新手的悲哀!
wwwwb 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gungod 的回复:]
引用 1 楼 wwwwb 的回复:
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateT……
[/Quote]
仔细看看
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateTime < DATE_ADD(BDate, INTERVAL '1 0:5' DAY_MINUTE);
gw6328 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gungod 的回复:]
引用 1 楼 wwwwb 的回复:
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateT……
[/Quote]
上面1楼都回答了
select a1,a2,a3... into 变量1,变量2... from tb
gungod 2011-03-17
  • 打赏
  • 举报
回复
分两次但是通过了。。。
gungod 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateTime < DATE_ADD(B……
[/Quote]

select ...into 的语法我也用过了,也不行。
这样可以:
ROUND(IFNULL(MAX(Airtemp),0),1) into `MaxValue`


但这样不行
ROUND(IFNULL(MAX(Airtemp),0),1) into `MaxValue`, ROUND(IFNULL(MIN(Airtemp),0),1) into `MinValue`

分两次?
wwwwb 2011-03-17
  • 打赏
  • 举报
回复
SELECT ROUND(IFNULL(MAX(Airtemp),0),1) ,ROUND(IFNULL(MIN(Airtemp),0),1)
into `MaxValue` , `MinValue`
FROM tbl_name WHERE InDateTime > DATE_ADD(BDate, INTERVAL 23 HOUR) AND InDateTime < DATE_ADD(BDate, INTERVAL '1 0:5' DAY_MINUTE);

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧