ストアド プロシージャの作成と操作は初めてです。
チュートリアルを読んだり、試したりするのに数時間を費やした後(そして、スタックオーバーフローで関連するすべての質問を読んでいます:-))、私は立ち往生しています。
これはうまくいきます:
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 does not exist" それは関数ではなく、プロシージャです。
基本的に、私の質問: ストアド プロシージャ内で別のプロシージャを呼び出し、その結果を変数に設定するにはどうすればよいですか?