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,如本例所示。