【问题标题】:PL/SQL procedure to dynamically pass the valuePL/SQL 过程动态传递值
【发布时间】:2016-04-21 13:14:23
【问题描述】:
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;

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

【问题讨论】:

    标签: sql oracle plsql procedure


    【解决方案1】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 2016-07-05
      • 2019-12-03
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多