1

Тема: Вызов хранимой процедуры

phpmyadmin - 3.2.3. mysql 5.0.5-dev
Создал хранимую процедуру: (именно через phpmyadmin)

CREATE procedure `my_proc` (
out id_books integer(11),
out id_users integer(11),
out fname varchar(50),
out lname varchar(50),
out otch varchar(50),
out namebook varchar(50),
out status_book integer(11),
out date_book varchar(50)
)
SELECT id_books, id_users, fname, lname, otch, namebook, status_book, date_book
FROM `status`
LEFT JOIN users ON id_users = id_user
LEFT JOIN books ON id_books = id_book

Все прошло успешно.
Далее вызываю саму процедуру командой

call my_proc

И пишет вот такую ошибку:

Incorrect number of arguments for PROCEDURE bibl_system.proc; expected 8, got 0

А если создать другой вариант:

CREATE procedure `my_proc` ()
SELECT id_books, id_users, fname, lname, otch, namebook, status_book, date_book
FROM `status`
LEFT JOIN users ON id_users = id_user
LEFT JOIN books ON id_books = id_book

то потом вызываю процедуру

call my_proc

пишет

Thread stack overrun: 6436 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.

где ошибки и в каком месте исправить?!

2

Re: Вызов хранимой процедуры

Судя по запросу, думаю лучше использовать вьюшку (VIEW), а не процедуру.

Сперва составьте работающий запрос из объединенных таблиц и затем из него сделайте вьюшку.

CREATE VIEW `view_name` AS SELECT `id_books`...

При объединении таблиц используйте префиксы их имен. То есть не просто id_books, а `status`.`id_books`

Вызвать вьюшку можно обычным запросом:

SELECT * FROM `view_name`;

3 (изменено: KuPbI4, 2010-12-12 20:06:19)

Re: Вызов хранимой процедуры

Прочитал Ваше объяснение, заработало!

CREATE VIEW `view_s` AS SELECT `status`.`id_books`, `status`.`id_users`, `users`.`fname`, `users`.`lname`, `users`.`otch`, `books`.`namebook`, `status`.`status_book`, `status`.`date_book`
FROM `status`
LEFT JOIN `users` ON `id_users` = `id_user`
LEFT JOIN `books` ON `id_books` = `id_book`

далее вызвал вьюшку через пхпмайадмин

select * from view_s

все работает и показывает то что нужно.
а как вызвать в php-скрипте вьюшку?!

    $i=0;
    $query="select * from view_s";
    $result=mysql_query($query);
    if(mysql_error()) {
        echo mysql_error();
    }
    else {
    while($row=mysql_fetch_row($result))
        {
            $i++;
        } 
    }

ничего не выводит...

4

Re: Вызов хранимой процедуры

Работа с вьюшками возможна только через расширение mysqli, только оно поддерживает функции MySQL 5.

Используемое расширение поменять достаточно просто, добавив букву (i) во всех используемых функциях работающих с MySQL.

Обратите внимание, что некоторые функции требуют дополнительные параметры.

Пример замены:
mysql_fetch_assoc() меняем на mysqli_fetch_assoc()

Документация расширения MySQLi и список функций

5

Re: Вызов хранимой процедуры

Спасибо за объяснение, но не заработало.

 $i=0;
    $query="select * from view_s";
    $result=mysqli_query($query);
    if(mysqli_error()) {
        echo mysqli_error();
    }
    else {
    while($row=mysqli_fetch_row($result))
        {
            $i++;
        } 
    }

ошибки

Warning: mysqli_query() expects at least 2 parameters, 1 given in Z:\home\biblioteka59.ru\www\catalog.php on line 151

Warning: mysqli_error() expects exactly 1 parameter, 0 given in Z:\home\biblioteka59.ru\www\catalog.php on line 152

Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, null given in Z:\home\biblioteka59.ru\www\catalog.php on line 156

6

Re: Вызов хранимой процедуры

Я упомянул о добавлении параметров в функциях, недостаточно только добавить (i) в именах функций.

mysqli_query($link, $query);
В данном случае переменная $link - это ссылка на соединение возвращенное функцией mysqli_connect().

Остальные функции смотрите по документации.

7

Re: Вызов хранимой процедуры

А если

CREATE procedure `my_proc` ()
DECLARE @id_books int;
SELECT id_books, id_users, fname, lname, otch, namebook, status_book, date_book
FROM `status`
LEFT JOIN users ON id_users = id_user
LEFT JOIN books ON id_books = id_book

то почему орет на ошибку

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @id_books int' at line 2

что-то тут не так?

8

Re: Вызов хранимой процедуры

KuPbI4 сказал:

что-то тут не так?

Процедуры не предназначены для выборки данных в виде строк, они передают и возвращают только несколько параметров.

9

Re: Вызов хранимой процедуры

Hanut сказал:

Процедуры не предназначены для выборки данных в виде строк, они передают и возвращают только несколько параметров.

все понятно, значит никак не сделать нормально процедуру.