在树上抓取的过程。当您调用递归过程时SQL错误(-674):无法解析Routine(depends_get_vetka)。
IBM Informix Dynamic Server版本11.70.FC3
CREATE PROCEDURE "informix".depending_get_vetka(p_vetka integer default 0)
RETURNING
int as nomerVetki;
define _nomerVetkiChild int;
define _itemproperties varchar(255);
let _nomerVetkiChild = 0;
let _itemproperties = '';
FOREACH select p.itemproperties into _itemproperties from param_menu p where (p.vetka = p_vetka) and NOT ((p.itemproperties is null) or (p.itemproperties = ''))
select vetka into _nomerVetkiChild from menu where codename = _itemproperties;
return _nomerVetkiChild WITH RESUME;
execute procedure depending_get_vetka(_nomerVetkiChild);
END FOREACH;
END PROCEDURE;
答案 0 :(得分:2)
让我们构建下一个测试用例以简化:
CREATE PROCEDURE sp2()
RETURNING INT AS col;
RETURN 2 WITH RESUME;
RETURN 3 WITH RESUME;
RETURN 4 WITH RESUME;
END PROCEDURE;
CREATE PROCEDURE sp1()
RETURNING INT AS col;
RETURN 1 WITH RESUME;
EXECUTE PROCEDURE sp2();
RETURN 5 WITH RESUME;
END PROCEDURE;
如果你尝试执行它,你也会得到:
674:无法解决例行程序(sp2)。
如果它返回一个或多个值,那么您应该创建一个FUNCTION:
Using CREATE PROCEDURE Versus CREATE FUNCTION
让我们将其创建为FUNCTION
:
DROP FUNCTION sp1;
DROP FUNCTION sp2;
CREATE FUNCTION sp2()
RETURNING INT AS col;
RETURN 2 WITH RESUME;
RETURN 3 WITH RESUME;
RETURN 4 WITH RESUME;
END FUNCTION;
CREATE FUNCTION sp1()
RETURNING INT AS col;
RETURN 1 WITH RESUME;
EXECUTE FUNCTION sp2();
RETURN 5 WITH RESUME;
END FUNCTION;
现在,如果再次执行它:
684:函数(informix.sp2)返回太多值。
让我们尝试另一种方式:
DROP FUNCTION sp1;
CREATE FUNCTION sp1()
RETURNING INT AS col;
DEFINE val INT;
RETURN 1 WITH RESUME;
FOREACH SELECT * INTO val FROM TABLE(sp2())
RETURN val WITH RESUME;
END FOREACH;
RETURN 5 WITH RESUME;
END FUNCTION;
如果您尝试这样做,您将获得,但没有错误:
EXECUTE PROCEDURE sp(1);
col
1
2
3
4
5
尝试将PROCEDURE
更改为FUNCTION
,并在递归调用中使用FOREACH
,例如此示例。