所以我将此代码作为存储过程的一部分:
SET @MID = 0;
SET @MX = 0;
SET @MY = 0;
SET @MT = 0;
SET @CSTAMP = '2014-6-06 08:03:19';
SELECT @MID=m.ID, @MX=m.x , @MY=m.y , @MT=m.timestamp FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (SELECT MAX(T.timestamp)
FROM (SELECT mm.timestamp FROM movement mm WHERE mm.ID = cSID AND mm.timestamp <= @CSTAMP)AS T);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(ctstamp,@MID,@MX,@MY,@MT);
基本上,它会创建一些用户定义的变量,在查询中为它们分配值,并尝试将它们插入名为DBTable
的表中,其中列为ctimestamp
,ID
,{{ 1}},x
,y
。问题是,当我在查询后看到mtimestamp
时,DBTable
,ID
,x
和y
列都是空的(只有0) ,只有mtimestamp
填充了游标变量ctimestamp
中的值。
我不知道这里有什么问题......我插入表错了吗?我不能以这种方式插入像ctstamp
这样的变量吗?
任何帮助将不胜感激,谢谢!
编辑
我只是想到了,因为用户定义的变量是特定于会话的,这是否意味着我无法退出我的客户端并关闭计算机并让数据库服务器运行其余的查询?对不起,如果这看起来像一个愚蠢的问题,但我对存储过程和新功能非常陌生。 SQL。
答案 0 :(得分:1)
如果在存储过程中使用常规变量,则最好。会话变量没有数据类型,如果碰巧调用其他使用相同会话变量的过程,则可能在过程执行期间发生变化。
DECLARE v_mid int;
DECLARE v_mx int;
DECLARE v_my int;
DECLARE v_mt int;
DECLARE v_time datetime;
SELECT m.ID, m.x, m.y, m.timestamp INTO v_mid, v_mx, v_my, v_mt, v_time
FROM movement m
WHERE m.ID = cSID
AND m.timestamp = (
SELECT MAX(mm.timestamp)
FROM movement mm
WHERE mm.ID = cSID AND mm.timestamp <= v_time
);
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
VALUES(v_time,v_mid,v_mx,v_my,v_mt);
答案 1 :(得分:1)
在SELECT语句中,对用户定义变量的赋值使用(类似于pascal的)赋值运算符( :=
),而不仅仅是等号。
例如,这会将值'foo'
分配给用户定义的变量:
SELECT @var := 'foo'
^
这与此有很大不同:
SELECT @var = 'foo'
^
这不执行任务;它被评估为布尔表达式,相等比较的结果返回0,1或NULL。
<强>后续强>
不需要所有这些用户定义的变量。您可以更有效地完成相同的结果(使用更少的SQL语句)
假设cSID
是一个过程变量,你可以用以下方法完成一个等效的结果:
SET @CSTAMP = '2014-6-06 08:03:19';
INSERT INTO DBTable(`ctimestamp`,`ID`,`x`,`y`,`mtimestamp`)
SELECT t.ctimestamp, m.ID, m.x, m.y, m.timestamp AS mtimestamp
FROM movement m
JOIN ( SELECT @CSTAMP + INTERVAL 0 DAY AS ctimestamp
, MAX(mm.timestamp) AS max_mm_timestamp
FROM movement mm
WHERE mm.ID = cSID
AND mm.timestamp <= @CSTAMP + INTERVAL 0 DAY
) t
ON m.ID = cSID
AND m.timestamp = t.max_mm_timestamp
ORDER BY 3,4
LIMIT 1
(用户定义的变量@CSTAMP可以用过程变量替换。
DECLARE v_cstamp DATETIME DEFAULT '2014-06-06 08:03:19';
然后将对@CSTAMP
的引用替换为对过程变量的引用... v_cstamp
。