我有以下mysql存储过程
create procedure SP_InsertTag_Level2 (tag_v varchar(50), CNT_v int) select tweet_id into @tid from tweet_tags where tag=tag_v; insert into collected_tags (tag,country) select tag_v, A.country from collected_tags A, tweet_tags B where A.tag=B.tag and B.tweet_id=@tid; select id into @Id from collected_tags where tag=tag_v; IF @Id IS NOT NULL THEN insert into stats_tag(id,counter) values (@id,CNT_v); END IF; end;
现在我收到上面粗体线的错误ERROR 1054 (42S22): Unknown column 'tag_v' in 'field list'
,因为tag_v不是gather_tags表中的列(它是SP中的参数)
如何在存储过程的选定列列表中保留(插入)变量?
答案 0 :(得分:2)
您需要使用BEGIN
启动存储过程正文
此外,我建议不要在存储过程中使用@vars,因为它们会泄漏到外部。最好使用类型化声明的变量。
为了成功关闭存储过程,您需要声明自定义分隔符
并使用它来关闭最终的END
DELIMITER $$
CREATE PROCEDURE SP_InsertTag_Level2 (IN tag_v varchar(50), IN CNT_v int)
BEGIN
DECLARE tid INTEGER;
DECLARE myid INTEGER;
SELECT tweet_id INTO tid FROM tweet_tags WHERE tag=tag_v;
INSERT INTO collected_tags (tag,country)
SELECT tag_v, A.country
FROM collected_tags A
INNER JOIN tweet_tags B on (A.tag = B.tag)
WHERE B.tweet_id = tid
SELECT id INTO myId FROM collected_tags WHERE tag=tag_v;
IF (myId IS NOT NULL) THEN
INSERT INTO stats_tag(id,counter) VALUES (myid,CNT_v);
END IF;
END $$
DELIMITER ;
隐含联接是邪恶的
不要使用隐式连接,它们是反模式,而是使用显式连接语法。