[英]Oracle Stored Procedure returning collection of table
我想用集合編寫一個過程。
我有一張桌子 - employee
- 我想要退回以下內容:
我的最終記錄集或數組表應返回低於值。 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.