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.
我想 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.