【问题标题】:How to replace a variable with another based on a condition in a stored procedure?如何根据存储过程中的条件将变量替换为另一个变量?
【发布时间】:2021-10-24 04:10:50
【问题描述】:

我在帽子下面的存储过程工作正常。 无论是谁,我都希望能够检查是否存在带有 YesterdayDate 的数据集,如果不存在,请将 YesterdayDate 替换为 TodayDate

我正在尝试检查此计数 select count(1) from TableName where DATASET_DATE = YesterdayDate 是否为 0,但如果有的话,我找不到一种方法来将此检查添加到代码中,而无需修改或破坏其他所有内容。

存储过程:

CREATE OR REPLACE function DO_STUFF
(TodayDate date, YesterdayDate date)

return integer is status integer;

BEGIN 

DECLARE
  CURSOR c_stuff
  IS
    SELECT 
        <several_fields>
    FROM 
        TableName TODAY 
        LEFT JOIN TableName YESTERDAY
        ON  TODAY.KEY1 = YESTERDAY.KEY1
        WHERE TODAY.DATASET_DATE = TodayDate
        AND YESTERDAY.DATASET_DATE = YesterdayDate
    ORDER BY 
        TODAY.KEY1 ASC;
BEGIN
  FOR r_lines IN c_stuff
  LOOP
    <do_some_stuff>
  END LOOP;
END;

COMMIT;

STATUS := 0;

return status;

END
/

有人知道如何实现这一点吗?

-- 编辑澄清: 我确实需要使用这两个谓词。 在 部分中,我主要进行计算并比较两个数据集(今天与昨天)并使用结果更新一些字段。 我在这里要完成的是通过今天与今天的比较,避免结果数据不正确,来处理昨天进程没有运行并且没有昨天数据集的情况。

【问题讨论】:

  • 那么您的目标是在where 子句中使用两个谓词之一,而不是同时使用两者?
  • 我相信我没有正确解释。我确实需要使用这两个谓词。在 部分中,我主要进行计算并比较两个数据集并使用结果更新一些字段。我在这里要完成的是通过今天与今天的比较,避免结果数据不正确,来处理昨天进程没有运行并且没有昨天数据集的情况。

标签: sql oracle variables stored-procedures


【解决方案1】:

您可以在没有JOIN 的情况下完成这一切:

CREATE OR REPLACE function DO_STUFF(
  TodayDate date,
  YesterdayDate date
) return integer
IS
  CURSOR c_stuff IS
    SELECT key1,
           field1,
           field2,
           field3
    FROM   (
      SELECT key1,
             field1,
             field2,
             field3,
             DENSE_RANK() OVER (
               ORDER BY CASE dataset_date WHEN YesterdayDate THEN 1 ELSE 2 END
             ) AS rnk
      FROM   TableName 
      WHERE  DATASET_DATE IN ( TodayDate, YesterdayDate )
    )
    WHERE rnk = 1
    ORDER BY KEY1 ASC;
BEGIN 
  FOR r_lines IN c_stuff
  LOOP
    <do_some_stuff>
  END LOOP;

  return 0;
END
/

【讨论】:

  • 谢谢,我不熟悉 DENSE_RANK,但我相信这不符合我的要求。我不需要使用一个日期或另一个日期,而是使用今天代替昨天,以防昨天没有数据(我将始终使用今天,因为该程序的目标是比较今天和昨天,目标这个“解决方法”是在没有昨天的情况下比较今天和今天)
【解决方案2】:

我不确定你想用这个函数做什么。无论我从您的第一行问题中了解到什么,您都可以尝试以下代码 -

CREATE OR REPLACE function DO_STUFF(TodayDate     date,
                                    YesterdayDate date)
RETURN INTEGER
IS
new_date DATE;
CNT NUMBER;
BEGIN
     SELECT COUNT(*)
       INTO CNT
       FROM TableName TODAY 
       LEFT JOIN TableName YESTERDAY ON TODAY.KEY1 = YESTERDAY.KEY1
      WHERE TODAY.DATASET_DATE = TodayDate
        AND YESTERDAY.DATASET_DATE = YesterdayDate
      ORDER BY TODAY.KEY1 ASC;
     IF CNT = 0 THEN
        RETURN TodayDate;
     ELSE
        RETURN YesterdayDate;
     END IF;
EXCEPTION
         WHEN OTHERS THEN
              RETURN '1900-01-01';
END;

【讨论】:

  • 这将作为程序的结果返回今天或明天,对吗?我编辑了我的问题以更好地解释,但我不想使用其中一个,我需要同时使用两者。在我比较今天和昨天的代码中,我想要的是一种设置昨天等于今天的方法,以防昨天没有数据集(在这种情况下有效地比较今天和今天)。但这给了我一些关于该做什么的想法,并且可能非常有用。谢谢
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 2021-02-22
  • 2021-12-04
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2012-10-16
  • 2020-01-08
相关资源
最近更新 更多