【发布时间】: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