MySql 5.1.32:调用存储过程中的另一个过程并设置变量

时间:2011-08-14 14:55:58

标签: mysql function variables stored-procedures not-exists

我是创建和使用存储过程的新手。

花了几个小时尝试,阅读教程(并在stackoverflow阅读所有相关问题:-))我被卡住了。

这很好用:

PROCEDURE GetAgent(IN AgentName VARCHAR(50), OUT AgentID SMALLINT(6))
BEGIN
    IF EXISTS (SELECT id FROM tbl_lookup WHERE value = AgentName AND cat = 'agent') THEN
        SELECT id FROM tbl_lookup WHERE value = AgentName AND cat = 'agent';
    ELSE
        INSERT INTO tbl_lookup(cat, value) VALUES ('agent', AgentName);
        SELECT id FROM tbl_lookup WHERE value = AgentName AND cat = 'agent';
    END IF;
END;

当被称为:

Call GetAgent("Firefox 3.6.18", @AgentID);

它给出了正确的答案:“2”

到目前为止一切顺利。所以让我们进入另一个程序:( GetOS做同样的事情,遗漏了最小化阅读: - )

PROCEDURE SetSessionInfo(IN OsName VARCHAR(50), IN AgentName VARCHAR(50), IN SessionID BIGINT(30), OUT SessionInfoID SMALLINT(6))
    BEGIN
        DECLARE nw_AgentID SMALLINT;
        DECLARE nw_OSID SMALLINT;

        CALL GetOs(OsName, @OsID);
        SET NW_OSID = @OSID;
        CALL GetAgent(AgentName, @AgentID);
        SET NW_AgentID = @AgentID;


        IF EXISTS (SELECT id FROM tbl_session_info WHERE session = SessionID) THEN
            SELECT id AS SessionInfoID  FROM tbl_session_info WHERE session = SessionID;
        ELSE
            INSERT INTO tbl_session_info(session, agent_id, os_id) VALUES (SessionID, GetAgent(AgentName, @AgentID), GetOs(OsName , @OsID));
            SELECT id AS SessionInfoID  FROM tbl_session_info WHERE session = SessionID;
        END IF;
    END;

使用

调用时
Call SetSessionInfo("Windows XP", "Firefox 3.6.18", 857264713, @SessionInfoID)

我得到答案“3”(来自GetOS的正确回答),然后程序停止并且不插入任何内容。

安装Toad之后我看到了原因:错误:“FUNCTION GetAgent不存在” 好吧,它不是一个功能,它是一个程序。

基本上,我的问题是: 如何调用存储过程中的其他过程并使用结果设置变量?

1 个答案:

答案 0 :(得分:2)

这就是为什么你得到“FUNCTION GetAgent不存在”错误:

INSERT INTO tbl_session_info(session, agent_id, os_id)
  VALUES (SessionID, GetAgent(AgentName, @AgentID), GetOs(OsName , @OsID));

您正在尝试将GetAgent作为一个函数调用(虽然它是一个过程)。但是您已经将代理和操作系统ID转换为变量。只需使用它们:

INSERT INTO tbl_session_info(session, agent_id, os_id)
  VALUES (SessionID, NW_AgentID, NW_OSID);