MySQL Использование хранимой процедуры в операторе выбора - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть хранимая процедура примерно так:

$connection->query('
   drop procedure if exists listing_count;
   create procedure listing_count(IN parent int(11))
   begin
    declare count1 int(11) default 0;
    declare count2 int(11) default 1;
    create temporary table ids as (select id from category where id=parent);
    while count1<>count2 do
     set count1=(select count(id) from ids);
     insert into ids(id) select id from category where id not in(select id from ids) and related in(select id from ids);     
     set count2=(select count(id) from ids);
    end while;
    (select count(*) from listing_category where category in(select id from ids));
   end');

$fetch=$connection->query('select *,listing_count(id) as listing_count from category')->fetchall(pdo::FETCH_UNIQUE|pdo::FETCH_ASSOC);

Я бы хотел использовать свою процедуру как функцию. Так что listing_count получает счет, чтобы я мог его использовать. Нужно ли создавать отдельную функцию? Может ли процедура получить мой счет и вернуть его?

Превращение в такую ​​функцию:

drop function if exists listing_count;
   create function listing_count(parent int(11)) returns int(11) deterministic
   begin
    declare count1 int(11) default 0;
    declare count2 int(11) default 1;
    create temporary table ids as (select id from category where id=parent);
    while count1<>count2 do
     set count1=(select count(id) from ids);
     insert into ids(id) select id from category where id not in(select id from ids) and related in(select id from ids);     
     set count2=(select count(id) from ids);
    end while;
    return (select count(*) from listing_category where category in(select id from ids));
   end

Но это не работает. Я не очень знаком с процедурами против функций, но я предполагаю, что не могу добавить все функции в функцию, как в процедуре.

1 Ответ

0 голосов
/ 28 апреля 2018

Я бы хотел использовать свою процедуру как функцию.

Вы не можете этого сделать и торговать;.

Я предлагаю вам преобразовать ваш sp в сохраненную функцию. В любом случае это хорошая идея, потому что она возвращает одно значение. Теперь у вас получится набор результатов из одной строки в одну строку. Если бы это была функция, она бы работала легко в любом контексте, который вам нужен. Напротив, хранимые процедуры, возвращающие наборы результатов, не так просты в использовании. Например, посмотрите это. Как использовать вывод таблицы из хранимой процедуры MYSQL

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

...