2011-10-10 63 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

相關問題