如何根据存储过程中的条件用另一个变量替换一个变量?
How to replace a variable with another based on a condition in a stored procedure?
我的帽子下面的存储过程工作正常。
不管是谁,我都希望能够检查是否存在具有 YesterdayDate 的数据集,如果不存在,则将 YesterdayDate 替换为 TodayDate.
如果此计数 select count(1) from TableName where DATASET_DATE = YesterdayDate
为 0,我正在尝试类似 cheking 之类的方法,但我找不到一种方法(假设有任何方法)将此检查添加到代码中而不必修改或破坏其他所有内容。
存储过程:
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
/
有人知道如何实现吗?
-- 编辑澄清:
我确实需要同时使用这两个谓词。
在 部分,我主要进行计算和比较两个数据集(今天与昨天)并使用结果更新一些字段。
我想在这里完成的是处理昨天过程不是 运行 并且没有昨天数据集的情况,通过今天与今天的比较并避免结果中的错误数据。
我不确定你想用这个函数做什么。无论我从您的第一行问题中了解到什么,您都可以尝试以下代码 -
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;
不用 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
/
我的帽子下面的存储过程工作正常。 不管是谁,我都希望能够检查是否存在具有 YesterdayDate 的数据集,如果不存在,则将 YesterdayDate 替换为 TodayDate.
如果此计数 select count(1) from TableName where DATASET_DATE = YesterdayDate
为 0,我正在尝试类似 cheking 之类的方法,但我找不到一种方法(假设有任何方法)将此检查添加到代码中而不必修改或破坏其他所有内容。
存储过程:
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
/
有人知道如何实现吗?
-- 编辑澄清:
我确实需要同时使用这两个谓词。
在
我不确定你想用这个函数做什么。无论我从您的第一行问题中了解到什么,您都可以尝试以下代码 -
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;
不用 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
/