Oracle 过程在多列中更改日期
Posted
技术标签:
【中文标题】Oracle 过程在多列中更改日期【英文标题】:Oracle procedure changing dates in multiple columns 【发布时间】:2018-05-21 08:44:42 【问题描述】:试图创建一个在结束日期小于 sysdate 时更改日期的过程,但它会更改所有日期,所以这里是代码:
CREATE OR REPLACE PROCEDURE CHANGE_DATES
as
BEGIN
FOR rec IN (SELECT start_period_date,end_period_date FROM mytable) LOOP
DBMS_OUTPUT.PUT_LINE('Old Date:' || rec.start_period_date ||' ' || rec.end_period_date);
IF rec.end_period_date < sysdate THEN
update mytable set start_period_date = sysdate;
update mytable set end_period_date = sysdate + 6;
commit;
--DBMS_OUTPUT.PUT_LINE('New Date:' || begin_date ||' ' ||end_date);
end if;
END LOOP;
END;
【问题讨论】:
您听说过“WHERE”子句吗?您的更新语句显式更新每条记录。 您需要一个 CURSOR 并使用WHERE CURRENT OF
或选择 rowid 并在 WHERE 子句中引用它
【参考方案1】:
您需要一个WHERE
子句(您可以在一个UPDATE
语句中完成所有操作):
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE mytable ( start_period_date, end_period_date ) AS
SELECT DATE '2018-01-01', DATE '2018-01-02' FROM DUAL
/
CREATE OR REPLACE PROCEDURE CHANGE_DATES
AS
start_dates SYS.ODCIDATELIST;
end_dates SYS.ODCIDATELIST;
BEGIN
UPDATE ( SELECT m.*,
( SELECT m.start_period_date FROM DUAL ) AS old_start_date,
( SELECT m.end_period_date FROM DUAL ) AS old_end_date
FROM mytable m )
SET start_period_date = SYSDATE,
end_period_date = SYSDATE + INTERVAL '6' DAY
WHERE end_period_date < SYSDATE
RETURNING old_start_date, old_end_date
BULK COLLECT INTO start_dates, end_dates;
FOR i IN 1 .. start_dates.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( 'Old Date:' || start_dates(i) ||' ' || end_dates(i) );
END LOOP;
-- Do not COMMIT in the procedure, COMMIT in the calling scope.
END;
/
查询 1:
BEGIN
CHANGE_DATES;
COMMIT;
END;
查询 2:
SELECT * FROM mytable
Results:
| START_PERIOD_DATE | END_PERIOD_DATE |
|----------------------|----------------------|
| 2018-05-21T09:06:05Z | 2018-05-27T09:06:05Z |
【讨论】:
谢谢。这真的很有帮助。以上是关于Oracle 过程在多列中更改日期的主要内容,如果未能解决你的问题,请参考以下文章
oracle过程中如何循环指定日期到当前日期,并且我要拿到这个日期
oracle过程中判断当前日期的日是否5,10,15....但是并不执行,求帮忙看一下在线等
oracle用存储过程实现对输入的日期判断是属于一年中的第几周,如20120101~20120107是