首页 文章

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

提问于
浏览
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 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 回答

  • 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 ;
    

    Implicit join's are evil
    不要使用隐式连接,它们是反模式,而是使用显式连接语法 .

相关问题