2009-11-26 188 views
2

我正在調用另一個存儲過程(子)的存儲過程(父)。 child proc每次返回一行記錄集。MySQL從另一個存儲過程調用一個存儲過程

我需要做的是從子進程中提取數據並在父進程中使用它。使用MSSQL的方法我會假設我可以填充臨時表,但我不太確定如何做到這一點。

任何幫助,這是非常感謝。

這是我的proc的當前版本。

DELIMITER// 

CREATE PROCEDURE CreateTransaction(IN p_TransType tinyint, in p_UserID INT) 

BEGIN 

DROP TEMPORARY TABLE IF EXISTS fileData_tmp; 

CREATE TEMPORARY TABLE fileData_tmp (t_FilePrefix varchar(5), t_FileSuffix int, t_FileDate varchar(4)); 

CALL GenerateFileNumber(p_TransType); 


END// 
DELIMITER; 

回答

2

如果你想返回一個值,爲什麼不使用的功能,而不是一個程序的?

DROP TABLE IF EXISTS Filename; 
CREATE TABLE Filename(
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO Filename(name) VALUES ('AAA'), ('BBB'), ('CCC'), ('DDD'), ('EEE'); 

DELIMITER // 
DROP FUNCTION IF EXISTS GenerateFileNumber// 
CREATE FUNCTION GenerateFileNumber(p_name VARCHAR(255)) 
RETURNS BIGINT 
COMMENT 'Gets the file number associated with the given name' 
BEGIN 
    DECLARE v_id BIGINT; 

    SELECT id INTO v_id FROM Filename WHERE name = p_name; 

    RETURN v_id; 
END; 
// 

DROP PROCEDURE IF EXISTS TestCall// 
CREATE PROCEDURE TestCall(p_name VARCHAR(255)) 
COMMENT 'Tests function call within a procedure' 
BEGIN 
    SELECT 'Returns: ' || COALESCE(GenerateFileNumber(p_name), 'none') AS msg; 
END; 
// 

DELIMITER ; 

下面是它如何工作的:

mysql> CALL TestCall('CCC'); 
+------------+ 
| msg  | 
+------------+ 
| Returns: 3 | 
+------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> CALL TestCall('XXX'); 
+---------------+ 
| msg   | 
+---------------+ 
| Returns: none | 
+---------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected, 1 warning (0.00 sec) 
+0

我沒有使用函數的原因是我需要從GenerateFileNumber返回一個查詢集合。返回的查詢集包含3列。我需要在我的父程序中使用來自各個地方的各列 的數據,然後最終將所有3個字符串轉換爲字符串。 – Tempname 2009-11-26 17:43:48

+0

啊,我沒有意識到這一點。我將使用臨時表添加另一個答案。 – 2009-11-26 21:33:48

3

當你想返回多個值這將工作。

DROP TABLE IF EXISTS Filename; 
CREATE TABLE Filename(
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO Filename(name) VALUES ('AAA'), ('BBB'), ('CCC'), ('DDD'), ('EEE'); 

DELIMITER // 
DROP PROCEDURE IF EXISTS GenerateFileNumber// 
CREATE PROCEDURE GenerateFileNumber(p_name VARCHAR(255)) 
COMMENT 'Gets the file number associated with the given name' 
BEGIN 
    DECLARE v_id BIGINT; 

    DROP TABLE IF EXISTS ReturnValues; 
    CREATE TEMPORARY TABLE ReturnValues (
     val1 BIGINT(20) UNSIGNED, 
     str1 VARCHAR(255) 
    ); 

    SELECT id INTO v_id FROM Filename WHERE name = p_name; 
    INSERT INTO ReturnValues(val1, str1) VALUES (v_id, 'Moop'); 
END; 
// 

DROP PROCEDURE IF EXISTS TestCall// 
CREATE PROCEDURE TestCall(p_name VARCHAR(255)) 
COMMENT 'Tests function call within a procedure' 
BEGIN 
    DECLARE v_id BIGINT; 
    DECLARE v_str VARCHAR(255); 

    CALL GenerateFileNumber(p_name); 

    SELECT val1, str1 INTO v_id, v_str FROM ReturnValues; 

    SELECT 'Returns: ' || COALESCE(v_id, 'none') || ', ' || v_str AS msg; 
END; 
// 

DELIMITER ; 

一般而言,儘可能地使用前面的基於函數的答案。它運行速度更快,而且您無需擔心意外地破壞臨時表。

mysql> call TestCall('AAA'); 
+------------------+ 
| msg    | 
+------------------+ 
| Returns: 1, Moop | 
+------------------+ 
1 row in set (0.27 sec) 

Query OK, 0 rows affected (0.27 sec) 

mysql> call TestCall('CCC'); 
+------------------+ 
| msg    | 
+------------------+ 
| Returns: 3, Moop | 
+------------------+ 
1 row in set (0.17 sec) 

Query OK, 0 rows affected (0.17 sec) 
相關問題