Хранимые процедуры MySQL не работают с SELECT (основной вопрос) - PullRequest
5 голосов
/ 02 марта 2010

Я использую платформу (perfectforms), которая требует, чтобы я использовал хранимые процедуры для большинства моих запросов, и никогда не использовал хранимые процедуры, я не могу понять, что я делаю неправильно. Следующий оператор выполняется без ошибок:

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.test_proc//
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; //
DELIMITER ;

Но когда я пытаюсь вызвать его, используя:

CALL test_proc();

Я получаю следующую ошибку:

#1312 - PROCEDURE test_db.test_proc can't return a result set in the given context

Я выполняю эти операторы из phpmyadmin 3.2.4, PHP версии 5.2.12, а версия сервера mysql - 5.0.89-community.

Когда я пишу хранимую процедуру, которая возвращает параметр, а затем выбираю его, все работает нормально (например,):

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.get_sum//
CREATE PROCEDURE test_db.get_sum(out total int)
BEGIN
SELECT SUM(field1) INTO total FROM test_db.test_table;
END //
DELIMITER ;

отлично работает, и когда я его называю:

CALL get_sum(@t); SELECT @t;

Я получаю сумму без проблем.

В конечном итоге мне нужно сделать необычный оператор SELECT, заключенный в хранимую процедуру, чтобы я мог его вызвать и вернуть несколько строк из нескольких полей. Сейчас я просто пытаюсь заставить любой выбрать рабочий.

Любая помощь очень ценится.

Ответы [ 4 ]

9 голосов
/ 13 марта 2010

Разобрался. Это не ошибка в PHP (хотя раньше) - это ошибка в некоторых версиях phpmyadmin. Одна и та же ошибка периодически появляется и исправляется в различных подрывных операциях (см. Выше):

#1312 - PROCEDURE [name] can't return a result set in the given context

Это поведение ограничено инструкциями SELECT в хранимых процедурах внутри phpmyadmin .

Использование такого клиента, как MySQL Workbench, решает эту проблему (или вы можете обновить phpmyadmin, но это неприятно, если вы находитесь на общем сервере, как и я).

В любом случае, спасибо всем за помощь.

1 голос
/ 30 августа 2013

Вероятно, это связано с ошибкой, связанной с PHP и SELECT в хранимой процедуре / подпрограмме. Один из возможных обходных путей - использовать SELECT ... INTO внутри хранимой процедуры, чтобы свести результат к одной переменной. Это работало в некоторых других случаях , которые я прочитал.

   SELECT * FROM category INTO c;
1 голос
/ 02 марта 2010

Проверьте вашу версию php, чтобы увидеть, если это сообщенная ошибка (см. здесь ).

Смотрите это сообщение: Невозможно вернуть набор результатов в данном контексте

0 голосов
/ 02 марта 2010

Когда я выполняю следующее:

DELIMITER //
DROP PROCEDURE IF EXISTS test_db.test_proc//
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; //
DELIMITER ;

Вслед за

CALL test_db.test_proc();

Я показываю мне набор результатов, как:

+-----+
| foo |
+-----+
| foo |
+-----+

Я использую PHP 5.3.1, MySQL 5.1.41 с phpMyAdmin 3.2.4.

Возможно, вы просто неправильно написали название своей процедуры?
Или может быть проблема с вашими установками PHP или MySQL? (Возможно, ошибка. Вы пытались обновить до последних версий?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...