关于重新打开数据库后,package重新执行的问题

wangweiquanqq 2007-04-29 08:42:13
我请人做的一个package的功能是网数据库中插入数据时,第一条记录插入p_date字段的内容(用的是pk_myprocess.get_p_date)是一个初始时间的10点,第二条记录是这个时间的16点,第三条是下一天的10点,第四条是下一天的16点,第五条是第3天的10点,第六条是第3天的16点,依次类推,我请人给写的如果是在一次打开数据库时能正常执行,但是如果关闭后,重新打开就又从第一天的10点开始执行,请大狭们帮改改,如何能让他再次打开数据后,pk_myprocess.get_p_date的值仍得到下一个值,而不是重新开始.
代码如下.
SQL> drop package pk_myprocess;

Package dropped

SQL> drop package body pk_myprocess;

drop package body pk_myprocess

ORA-04043: object PK_MYPROCESS does not exist

SQL> create or replace package pk_myprocess
2 is
3 function get_p_date return date;
4 function rollback_date return date;
5 end pk_myprocess;
6 /

Package created

SQL> create or replace package body pk_myprocess
2 is
3 last_date date;
4 function get_p_date return date
5 is
6 v_pdate date;
7 begin
8 last_date := nvl(last_date,trunc(sysdate));
9 if last_date = to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss') then
10 v_pdate := to_date(to_char(last_date,'yyyy-mm-dd')||' 16:00:00','yyyy-mm-dd hh24:mi:ss');
11 else
12 if last_date < to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss') then
13 v_pdate := to_date(to_char(last_date ,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
14 else
15 v_pdate := to_date(to_char(last_date + 1,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
16 end if;
17 end if;
18 last_date := v_pdate;
19 return v_pdate;
20 end get_p_date;
21 function rollback_date return date
22 is
23 v_pdate date;
24 begin
25 last_date := nvl(last_date,sysdate - 1);
26 if last_date = to_date(to_char(last_date,'yyyy-mm-dd')||' 16:00:00','yyyy-mm-dd hh24:mi:ss') then
27 v_pdate := to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
28 else
29 v_pdate := to_date(to_char(last_date - 1,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
30 end if;
31 last_date := v_pdate;
32 return v_pdate;
33 end rollback_date;
34
35 end pk_myprocess;
36 /

Package body created

SQL> drop table test_a;

Table dropped

SQL> create table test_a(id number,edit_date date,p_date date);

Table created

SQL> insert into test_a values(1,sysdate,pk_myprocess.get_p_date);

1 row inserted

SQL> commit;

Commit complete

SQL> insert into test_a values(2,sysdate,pk_myprocess.get_p_date);

1 row inserted

SQL> insert into test_a values(3,sysdate,pk_myprocess.get_p_date);

1 row inserted

SQL> select id,to_char(edit_date,'yyyy-mm-dd hh24:mi:ss') as edit_date,
2 to_char(p_date,'yyyy-mm-dd hh24:mi:ss') as p_date from test_a;

ID EDIT_DATE P_DATE
---------- ------------------- -------------------
1 2007-04-27 17:31:19 2007-04-27 10:00:00
2 2007-04-27 17:31:20 2007-04-27 16:00:00
3 2007-04-27 17:31:20 2007-04-28 10:00:00

SQL>
...全文
294 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
adaizi1980 2007-04-30
  • 打赏
  • 举报
回复
将每个函数里的last_date := nvl(last_date,trunc(sysdate));这一行替换为:
if last_date is null then
BEGIN
SELECT MAX(p_date) INTO last_date FROM test_a;
EXCEPTION
WHEN NO_DATA_FOUND THEN
last_date := TRUNC(SYSDATE);
END;
end if;
从而实现如果是重起后就从表里取最大的时间作为上一个时间的功能
DragonBill 2007-04-30
  • 打赏
  • 举报
回复
整个PACKAGE BODY就变成如下:
create or replace package body pk_myprocess
is
last_date date;

function get_p_date return date
is
v_pdate date;
begin
last_date := nvl(last_date,trunc(sysdate));
if last_date = to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss') then
v_pdate := to_date(to_char(last_date,'yyyy-mm-dd')||' 16:00:00','yyyy-mm-dd hh24:mi:ss');
else
if last_date < to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss') then
v_pdate := to_date(to_char(last_date ,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
else
v_pdate := to_date(to_char(last_date + 1,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
end if;
end if;
last_date := v_pdate;
return v_pdate;
end get_p_date;

function rollback_date return date
is
v_pdate date;
begin
last_date := nvl(last_date,sysdate - 1);
if last_date = to_date(to_char(last_date,'yyyy-mm-dd')||' 16:00:00','yyyy-mm-dd hh24:mi:ss') then
v_pdate := to_date(to_char(last_date,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
else
v_pdate := to_date(to_char(last_date - 1,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss');
end if;
last_date := v_pdate;
return v_pdate;
end rollback_date;

/******************Add By DragonBill****************************/
BEGIN
DECLARE
BEGIN
SELECT MAX(p_date) INTO last_date FROM test_a;
EXCEPTION
WHEN NO_DATA_FOUND THEN
last_date := TRUNC(SYSDATE);
END;
/******************Add By DragonBill***************************/
end pk_myprocess;
/
DragonBill 2007-04-30
  • 打赏
  • 举报
回复
在包体中加上:
BEGIN
DECLARE
BEGIN
SELECT MAX(p_date) INTO last_date FROM test_a;
EXCEPTION
WHEN NO_DATA_FOUND THEN
last_date := TRUNC(SYSDATE);
END;
wangweiquanqq 2007-04-29
  • 打赏
  • 举报
回复
怎么加呢?
能帮我改改吗?
我对这个一点也不会呀
tgm78 2007-04-29
  • 打赏
  • 举报
回复
加个判断条件,让它接着上面的值(cursor取得),试试

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧