我有一个类似的存储过程:
$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
但这不起作用。我对程序与函数不是很熟悉,但我认为我不能像在程序中那样将所有功能添加到函数中。
答案 0 :(得分:0)
我想像手术一样使用我的程序。
你不能这样做。
我建议你将sp转换为存储函数。在任何情况下,这都是一个好主意,因为它返回单个值。你现在拥有它的方式,它返回一列一行结果集。如果它是一个函数,它将在您需要的每个上下文中轻松工作。相反,返回结果集的存储过程并不那么容易使用。例如,看到这个。 How to use Table output from stored MYSQL Procedure
或者您可以编写一个存储函数来包装存储过程并返回值。在我看来,这是一个较差的解决方案,只是因为它有额外的复杂性。