2011-10-10 60 views
0

我有以下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 [email protected]; 
     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不collected_tags表列中的粗体行(它的参数在SP)
我怎能(插入)存储过程中所选列的变量?

回答

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 ; 

隐式连接的是邪恶的
不要使用隐式连接,它们是一个反模式,使用显式联接语法来代替。

+0

OMG ...我怎么错过了!致命的错误!感谢指出 – Alaa

+0

@Alaa,是的,我知道这些隐式连接很容易错过:-)。 – Johan

相关问题