繁体   English   中英

Oracle Stored Procedure返回表的集合

[英]Oracle Stored Procedure returning collection of table

我想用集合编写一个过程。

我有一张桌子 - employee - 我想要退回以下内容:

  • TEST1: sal <10000的员工人数
  • TEST2:部门> 10的员工人数
  • TEST3:雇用的员工人数>(SYSDATE-60)
  • TEST4:等级= 1的员工人数

我的最终记录集或数组表应返回低于值。 TEST1,TEST2,TEST3,TEST4是驻留在DESCRIPTION TABLE中的描述值,其中计数值来自employee表。

Description   COUNT
TEST1         10 
TEST2         15
TEST3         25
TEST4         50

请帮助实施。

此解决方案不会使用您的DESCRIPTION表动态计算计数,因为这很难实现。 所以,这是一个带有硬编码TESTn描述的解决方案。

首先,创建记录类型:

CREATE TYPE count_t AS OBJECT (
  description varchar2(100),
  cnt NUMBER(10)
);

然后,创建表类型:

CREATE TYPE count_tt AS TABLE OF count_t;

现在,编写函数:

CREATE OR REPLACE FUNCTION counts RETURN count_tt
IS
  v_result count_tt;
BEGIN
  SELECT count_t(description, cnt)
  BULK COLLECT INTO v_result
  FROM (
    SELECT 
      count(CASE WHEN sal < 10000 THEN 1 END) TEST1,
      count(CASE WHEN dept > 10 THEN 1 END) TEST2,
      count(CASE WHEN hiredate > SYSDATE - 60 THEN 1 END) TEST3,
      count(CASE WHEN grade = 1 THEN 1 END) TEST4
    FROM employees
  ) t
  -- Behold, the power of unpivot!
  UNPIVOT (
    cnt FOR description IN ("TEST1", "TEST2", "TEST3", "TEST4")
  );

  RETURN v_result;
END counts;
/

现在,调用函数,例如从SQL:

SELECT * FROM TABLE(counts)

请享用。

顺便说一下,我写了一篇博文, 将这个解决方案从性能角度与不使用UNPIVOT其他人进行比较

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM