如何将存储过程的参数传递给选中的列表?

时间:2011-10-10 14:49:26

标签: mysql stored-procedures

我有以下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中的参数)
如何在存储过程的选定列列表中保留(插入)变量?

1 个答案:

答案 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 ;

隐含联接是邪恶的
不要使用隐式连接,它们是反模式,而是使用显式连接语法。