PL / SQL过程动态传递值

时间:2016-04-21 13:14:23

标签: sql oracle plsql procedure

WITH CTE AS
(SELECT 
F.PARTITION_KEY,
(LAST_DAY(TO_DATE((PARTITION_KEY)||'01','YYYYMMDD'))) AS VALID_DATE,
F.EMP_NUM,
F.EMP_KEY,
D.EMP_ENTERED_DATE 
FROM F_EMP_ERROR, D_EMP D
WHERE 
F.EMP_NUM = D.EMP_NUM
AND F.PARTITION_KEY = 201603
and d.CONTRACT_PERIOD = 'Y')
SELECT COUNT(DISTINCT EMP_NUM) FROM CTE WHERE EMP_ENTERED_DATE > VALID_DATE;

如果我对特定月份进行硬编码,我的查询工作正常。如何将其转换为程序,当我输入年份时,它应该返回当年所有月份的记录数。

1 个答案:

答案 0 :(得分:0)

假设您的密钥以格式varchar2格式存储为YYYYMM,您可以使用:

CREATE FUNCTION fun(yearKey IN VARCHAR2)
    RETURN NUMBER AS
    retVal    NUMBER;
BEGIN
    WITH CTE AS
             (SELECT F.PARTITION_KEY,
                     (LAST_DAY(TO_DATE((PARTITION_KEY) || '01', 'YYYYMMDD'))) AS VALID_DATE,
                     F.EMP_NUM,
                     F.EMP_KEY,
                     D.EMP_ENTERED_DATE
                FROM F_EMP_ERROR, D_EMP D
               WHERE     F.EMP_NUM = D.EMP_NUM
                     AND F.PARTITION_KEY like yearKey || '%'
                     AND d.CONTRACT_PERIOD = 'Y')
    SELECT COUNT(DISTINCT EMP_NUM)
      INTO retVal
      FROM CTE
     WHERE EMP_ENTERED_DATE > VALID_DATE;

    RETURN retVal;
END;