routine()无法解决。递归过程
Routine () can not be resolved. A recursive procedure
在树上爬行的程序。调用递归过程时 SQL 错误 (-674): 例程 (depending_get_vetka) 无法解析。
IBM Informix Dynamic Server Version 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;
让我们构建下一个测试用例来简化:
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: Routine (sp2) can not be resolved.
如果它 returns 一个或多个值,那么您应该创建一个 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: Function (informix.sp2) returns too many values.
我们换个方式试试:
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
,如本例所示。
在树上爬行的程序。调用递归过程时 SQL 错误 (-674): 例程 (depending_get_vetka) 无法解析。
IBM Informix Dynamic Server Version 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;
让我们构建下一个测试用例来简化:
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: Routine (sp2) can not be resolved.
如果它 returns 一个或多个值,那么您应该创建一个 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: Function (informix.sp2) returns too many values.
我们换个方式试试:
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
,如本例所示。