• 浅谈Oracle函数返回Table集合


    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入Oracle函数中的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。

    管道化表函数必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它,从而使Oracle函数返回Table集合。

    1.使用自定义类型

    1. /* Formatted on 2010/02/26 08:42 (Formatter Plus v4.8.8) */  
    2. CREATE OR REPLACE TYPE objemp AS OBJECT (  
    3.    maxsal   NUMBER,  
    4.    minsal   NUMBER  
    5. );  
    6. /* Formatted on 2010/02/26 08:43 (Formatter Plus v4.8.8) */  
    7. CREATE OR REPLACE TYPE tabemp AS TABLE OF objemp;  
    8.  
    9.    

    2.使用Pipeline管道函数和Pipe row()

    1. CREATE OR REPLACE FUNCTION getmaxminsalary (department NUMBER)  
    2.    RETURN tabemp PIPELINED  
    3. AS  
    4.    maximum_salary   NUMBER;  
    5.    minimum_salary   NUMBER;  
    6.    v_errorcode      NUMBER;  
    7.    v_errortext      VARCHAR2 (200);  
    8.    v                objemp;  
    9. BEGIN  
    10.    FOR myrow IN (SELECT MAX (sal) m_sal, MIN (sal) min_sal  
    11.                    FROM emp  
    12.                   WHERE deptno = departmnet)  
    13.    LOOP  
    14.       v := (myrow.m_sal, myrow.min_sal);  
    15.       PIPE ROW (v);  
    16.    END LOOP;  
    17.    RETURN;  
    18. EXCEPTION  
    19.    WHEN OTHERS  
    20.    THEN  
    21.       v_errorcode :SQLCODE;  
    22.       v_errortext :SUBSTR (SQLERRM, 1, 200);  
    23.       INSERT INTO log_table  
    24.                   (code, MESSAGE, info  
    25.                   )  
    26.            VALUES (v_errorcode, v_errortext, 'getMaxMinSalary'  
    27.                  );  
    28. END;  
    29.  

    3.使用Table操作符

    1. SELECT * FROM TABLE(getMaxMinSalary(10)); 

    以上是一个不错的Oracle函数返回Table集合的实例,感兴趣的读者可以试一试。

  • 相关阅读:
    模型层
    视图层,模板层
    ORM表关系建立
    CMakeList入门
    C++标准模板库
    C++基本语法
    g++应用说明
    Linux快捷键
    Git 操作备忘
    Block的详细介绍
  • 原文地址:https://www.cnblogs.com/zhwl/p/3754569.html
Copyright © 2020-2023  润新知