我是创建和使用存储过程的新手。
花了几个小时尝试,阅读教程(并在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不存在” 好吧,它不是一个功能,它是一个程序。
基本上,我的问题是: 如何调用存储过程中的其他过程并使用结果设置变量?
答案 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);