【问题标题】:Oracle Stored Procedure returning collection of tableOracle 存储过程返回表的集合
【发布时间】:2016-04-09 16:56:21
【问题描述】:

我想写一个使用集合的过程。

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

  • TEST1:sal
  • TEST2: 部门 > 10 的员工数量
  • TEST3: 雇用日期 >(SYSDATE-60)
  • 的员工数量
  • TEST4: 成绩 = 1 的员工人数

我的最终记录集或数组表应返回以下值。 TEST1、TEST2、TEST3、TEST4 是位于 DESCRIPTION TABLE 中的描述值,其中计数值来自员工表。

Description   COUNT
TEST1         10 
TEST2         15
TEST3         25
TEST4         50

请帮助实施。

【问题讨论】:

  • 这不是代码编写服务。请向我们展示您迄今为止所做的尝试。
  • 请使用您为每个测试编写的示例 SQL 代码更新您的问题。

标签: sql oracle plsql oracle11g


【解决方案1】:

此解决方案不会使用您的 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)

享受吧。

顺便说一句,我写了一篇博文comparing this solution from a performance perspective with others that do not use UNPIVOT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2015-05-29
    • 2019-06-03
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多