高分请教oracle的default sysdate 怎么让每次写数据库时自动更新最新时间

fangaiwen 2011-04-11 11:26:36
高分请教oracle的default sysdate 怎么让每次写数据库时自动更新最新时间

表和情况如下:当我在WEB页面上修改密码时,入库的时间没有改变,入库的时间是用了Oracle default sysdate,若不用Oracle default sysdate,用什么办法解决最新时间。之前想过用Java的Date,但想到JAVA的日期时间和数据库日期是有区别的。请高手们赐教。感激不尽。谢谢

create table t_student
(
id number primary key not null, --主键
name varchar2(20) not null, --姓名
psw varchar2(20) not null, --密码
exchange_time date default sysdate --每次入库时间
);
commit;

insert into t_student(id,name,psw) values (1,'csdn','csdn');
select * from t_student;

1 csdn csdn 2011-4-11 上午 11:15:26
update t_student set psw='csdn123456' where id=1;
select * from t_student;

1 csdn csdn123456 2011-4-11 上午 11:15:26
...全文
2144 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangaiwen 2011-11-09
  • 打赏
  • 举报
回复
需求的是要这样实现,exchange_time字段能记录每一条数据的最后操作时间。每张表的用途又不一样,不会产生数据冗余。。
saintqq 2011-11-07
  • 打赏
  • 举报
回复
写个创建 对于每张都有exchange_time的表的触发器的过程呗
pl/sql 编程不就是干这个用的
有必要 几百张表都有exchange_time吗
不会产生数据冗余吧.
设计很重要的 后面改起来
工作量很大....
fangaiwen 2011-04-13
  • 打赏
  • 举报
回复
多谢大家给的意见,oracle触发器是可以解决此问题,但对于上百张表都有exchange_time 字段来说,为每张表建立一个触发器那可是无法接受的。

10楼的直接拼接SQL是可以实现,但对Code有小量的改动。。暂采用10楼的意见,不知有没有高手能提供更好的解决方案。

期待中。。。。
304的的哥 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangaiwen 的回复:]
在开发的过程中是要结合Java代码,单在PLSQL里写SQL语句是没有问题的。

PreparedStatement state= conn.prepareStatement("update t_student set psw=?,exchange_time =? where id=?");
state.setString(2,"sysdate"); //当设sysdate的时候,执行时是有问题的
[/Quote]

//在传参数的时候,将你的参数设置为id号和pwd;
//你只需要传入需要修改密码的id号和新pwd就可以了,
//关于修改时间问题,oracle触发器会为你解决的。
PreparedStatement state= conn.prepareStatement("update t_student set psw=? where id=?");
state.setString(2,"new_pwd");
iihero_ 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangaiwen 的回复:]

在开发的过程中是要结合Java代码,单在PLSQL里写SQL语句是没有问题的。

PreparedStatement state= conn.prepareStatement("update t_student set psw=?,exchange_time =? where id=?");
state.setString(2,"sysdate"); //当设sysdate的时候,执行时是有问题的
[/Quote]

sysdate不是string变量,当然不能了。
PreparedStatement state= conn.prepareStatement("update t_student set psw=?,exchange_time =sysdate where id=?");
// state.setString(2,"sysdate");

state.setString(1, "<newpsw>");
state.setInt(2, <newId>);

.......

UPC子夜 2011-04-11
  • 打赏
  • 举报
回复
create or replace trigger triggername
before update on tablename
for each row
begin
:NEW.exchange_time := sysdate;
end;
这是最简单的触发器 一行代码就能实现你的功能
SP12345678902 2011-04-11
  • 打赏
  • 举报
回复
触发器不难,楼主去搜一下吧
UPC子夜 2011-04-11
  • 打赏
  • 举报
回复
楼主啊 就算是Sequence也是insert的时候才行 你的default sysdate也只在insert的时候起作用 update肯定不行 你还没理解default的机制 default是在插入时给个默认值 update不会触发
10楼的语句你试过吗?把sysdate直接写进sql语句中 而不是以参数的形式传进去 我对java不熟 但是 如果sql没错 java语法不应该成为问题的

还有 触发器其实很简单 随便百度一下就会的
fangaiwen 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 intheair_2008 的回复:]
触发器 不解释
[/Quote]

个人能力比较菜,没怎么用触发器 。不知有没有像Sequence一样每次都能自动生成更新的办法
iqlife 2011-04-11
  • 打赏
  • 举报
回复
update t_student set psw=?,exchange_time =? where id=?
直接写到SQL里
这样

update t_student set psw=?,exchange_time =sysdate where id=?
fangaiwen 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 brainstorm_lee 的回复:]
update時再更新一遍每次入库时间就可以了..


SQL code
update t_student set psw='csdn123456',exchange_time = sysdate where id=1;
[/Quote]

在开发的过程中是要结合Java代码,单在PLSQL里写SQL语句是没有问题的。

PreparedStatement state= conn.prepareStatement("update t_student set psw=?,exchange_time =? where id=?");
state.setString(2,"sysdate"); //当设sysdate的时候,执行时是有问题的
fangaiwen 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iihero 的回复:]
这个很简单啊,请看下例:

SQL code
SQL> create table tdate(id int primary key, col2 varchar(32), col3 date default sysdate);

表已创建。

SQL> insert into tdate (id, col2) values(1, 'wang');

已创建 1 行。

SQL>……
[/Quote]

在开发的过程中是要结合Java代码,单在PLSQL里写SQL语句是没有问题的。

PreparedStatement state= conn.prepareStatement("update t_student set psw=?,exchange_time =? where id=?");
state.setString(2,"sysdate"); //当设sysdate的时候,执行时是有问题的
  • 打赏
  • 举报
回复
要么用触发器

要么在修改其他值的同时修改时间 (推荐)
2楼给的很清楚
SP12345678902 2011-04-11
  • 打赏
  • 举报
回复
应该不是很难的问题,更新的时候加个更新字段
SP12345678902 2011-04-11
  • 打赏
  • 举报
回复
update t_student set psw='csdn123456',exchange_time = sysdate where id=1;
intheair_2008 2011-04-11
  • 打赏
  • 举报
回复
触发器 不解释
Raul_Gonzalez 2011-04-11
  • 打赏
  • 举报
回复
update時再更新一遍每次入库时间就可以了..

update t_student set psw='csdn123456',exchange_time = sysdate where id=1;
iihero_ 2011-04-11
  • 打赏
  • 举报
回复
这个很简单啊,请看下例:
SQL> create table tdate(id int primary key, col2 varchar(32), col3 date default sysdate);

表已创建。

SQL> insert into tdate (id, col2) values(1, 'wang');

已创建 1 行。

SQL> alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> select * from tdate;

ID COL2
---------- ----------------------------------------------------------------
COL3
-------------------
1 wang
2011-04-11 11:35:21


SQL> update tdate set col2='wang_modified', col3=sysdate where id=1;

已更新 1 行。

SQL> select * from tdate;

ID COL2
---------- ----------------------------------------------------------------
COL3
-------------------
1 wang_modified
2011-04-11 11:36:49
lixinbill 2011-04-11
  • 打赏
  • 举报
回复
insert into t_student(id,name,psw,exchange_time) values (1,'csdn','csdn',sysdate);
把sysdate 写到sql中就行了 不用搞的太复杂
sn_tiantian 2011-04-11
  • 打赏
  • 举报
回复
默认值,触发器都可以解决吧
加载更多回复(1)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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