Routine()无法解决。递归过程

时间:2016-03-01 09:37:58

标签: sql informix

在树上抓取的过程。当您调用递归过程时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;

1 个答案:

答案 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,例如此示例。