MySQL вызывает хранимый процесс из другого хранимого процесса - PullRequest
2 голосов
/ 26 ноября 2009

Я работаю с сохраненным процессом (родительским), который вызывает другой сохраненный процесс (дочерний процесс). Дочерний процесс каждый раз возвращает набор записей с 1 строкой.

Что мне нужно сделать - это извлечь данные из дочернего процесса и использовать их в родительском процессе. Используя методологию из MSSQL, я бы предположил, что мог бы просто заполнить временную таблицу, но я не совсем уверен, как это сделать.

Любая помощь в этом с благодарностью.

Вот текущая версия моего процесса.

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 ]

3 голосов
/ 27 ноября 2009

Это будет работать, когда вы хотите вернуть несколько значений.

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)
2 голосов
/ 26 ноября 2009

Если вы пытаетесь вернуть значение, почему бы не использовать функцию вместо процедуры?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...