从递归存储过程返回多行

Posted

技术标签:

【中文标题】从递归存储过程返回多行【英文标题】:Return multiple rows from a recursive stored procedure 【发布时间】:2015-03-05 07:20:50 【问题描述】:

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

这是我目前的程序:

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 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     |  |            |           |
+-----------+-----------+--+------------+-----------+

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

我怎样才能将DBMS_OUTPUT.PUT_LINE(R.COMPONENT); 的输出作为结果返回?请注意,我无法更改数据库结构。

【问题讨论】:

据我了解,您可以使用递归 FUNCTION 返回一个值。你可以把问题说清楚 您要返回多行或多列? @Exhausted 请看看我的编辑。我希望这有助于理解问题。 @Polppan 多行。 @hofmeister 试试这个***.com/q/13225532/599528 【参考方案1】:

你可以简单地用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 更改为其他值。以上可以嵌入到你的程序中返回。

【讨论】:

非常感谢!我有一个类似的方法,但这个更好。如何在存储过程中“返回”结果?在cursor的帮助下? 使用OBJECT TYPE 变量返回,游标很少使用 有没有小例子,如何返回VARCHAR2的列表? 参考这里***.com/questions/10764229/…

以上是关于从递归存储过程返回多行的主要内容,如果未能解决你的问题,请参考以下文章

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

如何从 Oracle 存储过程中获取两个返回值

MySQL存储过程从列表中插入多行

存储多行存储过程数据以便稍后在 c# 中循环遍历行

Oracle存储过程中,查询结果有多行如何赋值

Postgres-存储过程 return 详解