Return 来自递归存储过程的多行

Return multiple rows from a recursive stored procedure

我想 return 多行作为存储过程的结果。我正在递归调用此存储过程,以读取所有嵌套值。

这是我目前的程序:

CREATE OR REPLACE PROCEDURE TEST 
(
  MATERIAL_H IN VARCHAR2,
) AS
BEGIN
  FOR R IN (SELECT COMPONENT FROM TTP10.PSMS WHERE MATERIAL = MATERIAL_H) LOOP
    TEST (R.COMPONENT);
    DBMS_OUTPUT.PUT_LINE(R.COMPONENT); -- Each COMPONENT should be one row in the result
  END LOOP;
END TEST;

编辑

如果添加数据库记录的例子。如您所见,MATERIAL 1 由多个 COMPONENT (89, 90, 91) 组成。这些组件也可以由其他组件组成,例如 COMPONENT (90, 5).

我的存储过程读取 material 和组件之间的所有关系。我想在 material.

中获取所有嵌套组件

MATERIAL 1: (89, 90, 91, 5, 6, 7, 2, 3, 4)

+-----------+-----------+--+------------+-----------+
| MATERIAL  | COMPONENT |  | MATERIALS  | COMPONENT |
+-----------+-----------+--+------------+-----------+
|     1     |     89    |  |      2     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     1     |     90    |  |      3     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     1     |     91    |  |      4     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     90    |     5     |  |      6     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     90    |     6     |  |      7     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     90    |     7     |  |     91     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     5     |     2     |  |     89     |    NULL   |
+-----------+-----------+--+------------+-----------+
|     5     |     3     |  |            |           |
+-----------+-----------+--+------------+-----------+
|     5     |     4     |  |            |           |
+-----------+-----------+--+------------+-----------+

我的存储过程运行良好,它打印了 material 和组件之间的所有嵌套关系。

我怎么能 return 来自 DBMS_OUTPUT.PUT_LINE(R.COMPONENT); 的输出呢?请注意,我无法更改数据库结构。

你可以简单地用SQL语句来找到这样的关系,这里不需要递归语句

SQL> desc material
 Name                                      Null?    Type
 ----------------------------------------- -------- -------

 MAT                                                NUMBER
 COMPONENT                                          NUMBER

我已经插入了你的示例值 sql 语句就像

select 
    distinct a.component
from 
 material a
where a.component is not null
START WITH a.mat = 1
CONNECT BY PRIOR a.component= a.mat;

输出如下

SQL> select
  2     distinct a.component
  3  from
  4   material a
  5  where a.component is not null
  6  START WITH a.mat = 1
  7  CONNECT BY PRIOR a.component= a.mat
  8  ;

 COMPONENT
----------
        89
         6
         7
         5
         2
         3
        91
        90
         4

9 rows selected.

如果您想要其他值,可以尝试将值 1 更改为其他值。以上可以在你的程序中嵌入到return.