在递归过程调用中需要帮助

时间:2019-09-16 22:16:22

标签: oracle recursion plsql

我需要编写一个过程(以递归方式调用自身)。 条件如下:

  1. 如果CONTACT NUMBER(假设它为varchar2)以'100-%'开头,则该过程应打印给定组的所有以100开头的CONTACT NUMBERS。
  2. 如果“联系电话”以“ 50%”开头,则应递归调用。

我尝试编写示例过程,但不幸的是没有得到结果。

CREATE OR REPLACE TYPE type_t AS
    TABLE OF VARCHAR2(100);

CREATE OR REPLACE PROCEDURE proc_test (
    in_group       IN VARCHAR2,
    contact_nmbr   OUT VARCHAR2
) AS
    v_out   type_t := type_t ();
BEGIN
    SELECT
        contact_id
    BULK COLLECT INTO
        v_out
    FROM
        my_table
    WHERE
        group_id = in_group;

    FOR i IN 1..v_out.count LOOP
        v_out.extend;
        IF
            v_out(i) LIKE '100-%'
        THEN
            contact_nmbr := v_out(i);
        ELSIF v_out(i) LIKE '50-%' THEN
            proc_test(v_out(i),contact_nmbr);
        END IF;

    END LOOP;

END;

/

运行此过程后,我没有得到输出。

DECLARE
    in_group       VARCHAR2(30) := '123ABC';
    contact_nmbr   VARCHAR2(30);
BEGIN
    proc_test(in_group,contact_nmbr);
    dbms_output.put_line(contact_nmbr);
END;

/ 这是表MY_TABLE中的示例数据

Group_Id          Contact_Id
---------------------------------------
001               100-001-01
001               70-001-01
001               100-002-01
001               50-001-01
50-001-01         30-001-01
50-001-01         100-100-01
50-001-01         50-100-01
50-100-01         50-200-01

1 个答案:

答案 0 :(得分:0)

我可以在您的脚本中看到的问题。...

1)您声明in_group = 123ABC,示例数据中没有数据匹配,因此它将永远不会返回任何内容...

in_group       VARCHAR2(30) := '123ABC';

2)成功找到联系人号码后,您不会退出循环,因此,除非您的最后一条记录是匹配的,否则您将不会获得输出;

3)在每个循环上增加v_out集合时,这毫无用处,不会造成任何伤害,但不是必需的

  v_out.extend;

因此,删除扩展并添加如下所示的出口。...

CREATE OR REPLACE PROCEDURE proc_test (
    in_group       IN VARCHAR2,
    contact_nmbr   OUT VARCHAR2
) AS
    v_out   type_t := type_t ();
BEGIN
    SELECT
        contact_id
    BULK COLLECT INTO
        v_out
    FROM
        my_table
    WHERE
        group_id = in_group;

    FOR i IN 1..v_out.count LOOP
        IF
            v_out(i) LIKE '100-%'
        THEN
            contact_nmbr := v_out(i);
            exit;
        ELSIF v_out(i) LIKE '50-%' THEN
            proc_test(v_out(i),contact_nmbr);
        END IF;

    END LOOP;

END;

并使用以下有效ID进行呼叫,您应该可以参加。

DECLARE
    in_group       VARCHAR2(30) := '001';
    contact_nmbr   VARCHAR2(30);
BEGIN
    proc_test(in_group,contact_nmbr);
    dbms_output.put_line(contact_nmbr);
END;