【问题标题】:MySql 5.1.32: call another procedure within a stored procedure and set variableMySql 5.1.32:在存储过程中调用另一个过程并设置变量
【发布时间】:2011-10-26 19:35:29
【问题描述】:

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

花了几个小时尝试阅读教程(是的,阅读了 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 不存在” 嗯,它不是一个函数,它是一个过程。

所以基本上,我的问题是: 如何在存储过程中调用另一个过程并使用结果设置变量?

【问题讨论】:

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


    【解决方案1】:

    这就是您收到“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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2014-09-17
      相关资源
      最近更新 更多