1

ストアド プロシージャの作成と操作は初めてです。

チュートリアルを読んだり、試したりするのに数時間を費やした後(そして、スタックオーバーフローで関連するすべての質問を読んでいます:-))、私は立ち往生しています。

これはうまくいきます:

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" それは関数ではなく、プロシージャです。

基本的に、私の質問: ストアド プロシージャ内で別のプロシージャを呼び出し、その結果を変数に設定するにはどうすればよいですか?

4

1 に答える 1

2

これが、「FUNCTION GetAgent が存在しません」というエラーが発生する理由です。

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

GetAgent を関数として呼び出そうとしています (プロシージャである場合)。しかし、すでにエージェント ID と OS ID を変数に入れています。それらを使用するだけです:

INSERT INTO tbl_session_info(session, agent_id, os_id)
  VALUES (SessionID, NW_AgentID, NW_OSID);
于 2012-12-12T15:31:13.897 に答える