Sql 返回表集合的Oracle存储过程

Sql 返回表集合的Oracle存储过程,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我想使用集合编写一个过程 我有一个表-employee,我想返回以下内容: 测试1:sal10的员工计数 测试3:雇佣员工人数>(SYSDATE-60) 测试4:等级为1的员工计数 我的最终记录集或数组表应返回以下值。TEST1、TEST2、TEST3、TEST4是驻留在描述表中的描述值,其中as计数值来自employee表 Description COUNT TEST1 10 TEST2 15 TEST3 25 TEST4

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

我有一个表-
employee
,我想返回以下内容:

  • 测试1:sal<10000的员工计数
  • 测试2:部门>10的员工计数
  • 测试3:雇佣员工人数>(SYSDATE-60)
  • 测试4:等级为1的员工计数
我的最终记录集或数组表应返回以下值。TEST1、TEST2、TEST3、TEST4是驻留在描述表中的描述值,其中as计数值来自employee表

Description   COUNT
TEST1         10 
TEST2         15
TEST3         25
TEST4         50

请帮助实施。

此解决方案不会使用您的
说明
表来动态计算计数,因为这很难实现。因此,这里有一个带有硬编码
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)