簡體   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