PL/SQL 过程动态传递值

Posted

技术标签:

【中文标题】PL/SQL 过程动态传递值【英文标题】:PL/SQL procedure to dynamically pass the value 【发布时间】: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;

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

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于PL/SQL 过程动态传递值的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 函数 - 为 SELECT ... NOT IN() 动态传递多个 varchar2 值

PL/SQL Oracle :- 在传递值时动态 UNPIVOT ORACLE TABLE

如何拆分传递给pl sql过程的参数值

如何动态地将表名传递给 PL SQL 游标?

每个将表名传递给过程的 ORACLE PL/SQL

Oracle PL/SQL 过程/函数来创建包含列的视图