當你想返回多個值這將工作。
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)
我沒有使用函數的原因是我需要從GenerateFileNumber返回一個查詢集合。返回的查詢集包含3列。我需要在我的父程序中使用來自各個地方的各列 的數據,然後最終將所有3個字符串轉換爲字符串。 – Tempname 2009-11-26 17:43:48
啊,我沒有意識到這一點。我將使用臨時表添加另一個答案。 – 2009-11-26 21:33:48