如何循环更新oracle一列的值
各位大侠,你们。我要更新oracle数据库中,其中一张表的指定一列的值,如何循环更新呢?单独的更新是没有问下面我把单独更新的SQL列出来:updateuf_staffin...
各位大侠,你们。我要更新oracle数据库中,其中一张表的指定一列的值,如何循环更新呢?单独的更新是没有问
下面我把单独更新的SQL列出来:
update uf_staffinformlogin set logintime=replace(logintime,'11-6-1','2011-06-01')
...
update uf_staffinformlogin set logintime=replace(logintime,'11-6-21','2011-06-21')
...
update uf_staffinformlogin set logintime=replace(logintime,'11-6-27','2011-06-27')
这个我现在不知道该如何写这个循环条件,麻烦各位了。。。 展开
下面我把单独更新的SQL列出来:
update uf_staffinformlogin set logintime=replace(logintime,'11-6-1','2011-06-01')
...
update uf_staffinformlogin set logintime=replace(logintime,'11-6-21','2011-06-21')
...
update uf_staffinformlogin set logintime=replace(logintime,'11-6-27','2011-06-27')
这个我现在不知道该如何写这个循环条件,麻烦各位了。。。 展开
10个回答
展开全部
哥们,不用循环吧?再说用循环也不能解决吧,循环你的值怎么赋?你怎么知道下个记录该更新成什么?
通过to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd')试试可不可转换,没环境没法试,不行的话用instr函数,一句update就行了,不过我现在没时间写代码,给你个思路
instr((logintime,'-',1)可以取出第一个-的位置,然后通过substr(logintime,1,instr((logintime,'-',1)-1)取出第一个-前面的部分,就是年,20||就行了,然后再用instr(logintime,'-',2)
--这个是第2个-的位置,知道第1、2个-的位置后还是通过substr取出第1个-和第2个-之间的字符,就是月,case when一下如果是1位就补个0,。。。。依次类推,麻烦是麻烦点,但是比较通用,能适应各种情况,不过日期的话应该有规律,应该能根据规律简化不少,你自己琢磨吧.
如果你非要用循环可通过rowid这个伪列,即定义一个参数做计数用,循环一次加1,直到等于max(rowid)为止,不过我实在想不出用循环怎么弄,期待高手。。。
通过to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd')试试可不可转换,没环境没法试,不行的话用instr函数,一句update就行了,不过我现在没时间写代码,给你个思路
instr((logintime,'-',1)可以取出第一个-的位置,然后通过substr(logintime,1,instr((logintime,'-',1)-1)取出第一个-前面的部分,就是年,20||就行了,然后再用instr(logintime,'-',2)
--这个是第2个-的位置,知道第1、2个-的位置后还是通过substr取出第1个-和第2个-之间的字符,就是月,case when一下如果是1位就补个0,。。。。依次类推,麻烦是麻烦点,但是比较通用,能适应各种情况,不过日期的话应该有规律,应该能根据规律简化不少,你自己琢磨吧.
如果你非要用循环可通过rowid这个伪列,即定义一个参数做计数用,循环一次加1,直到等于max(rowid)为止,不过我实在想不出用循环怎么弄,期待高手。。。
推荐于2017-08-23
展开全部
如何循环更新oracle一列的值
----运行下面过程的时候最好备份你的数据表,先用备份的数据表来测试转换是否有问题
----使用备份数据表测试只需把下面的表名修改成备份数据表名即可,
declare
cursor c_cur is
select * from uf_staffinformlogin for update of logintime;
v_logintime date;
begin
for i in c_cur loop
v_logintime:=to_date(i.logintime,'yy-mm-dd'); ---- 这里是一个字符串转时间类型的转换,你需要
----运行下面过程的时候最好备份你的数据表,先用备份的数据表来测试转换是否有问题
----使用备份数据表测试只需把下面的表名修改成备份数据表名即可,
declare
cursor c_cur is
select * from uf_staffinformlogin for update of logintime;
v_logintime date;
begin
for i in c_cur loop
v_logintime:=to_date(i.logintime,'yy-mm-dd'); ---- 这里是一个字符串转时间类型的转换,你需要
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
----运行下面过程的时候最好备份你的数据表,先用备份的数据表来测试转换是否有问题
----使用备份数据表测试只需把下面的表名修改成备份数据表名即可,
declare
cursor c_cur is
select * from uf_staffinformlogin for update of logintime;
v_logintime date;
begin
for i in c_cur loop
v_logintime:=to_date(i.logintime,'yy-mm-dd'); ---- 这里是一个字符串转时间类型的转换,你需要
----测试转换是否有问题,oracle可能把11转换成1911,我这里没有测试环境不能确定
update uf_staffinformlogin set logintime=to_char(v_logintime,'yyyy-mm-dd')
where current of c_cur; --这是基于游标的更新它会锁住你的logintime列,所以你要确定你的数据
----库在你更新的时候不会修改logintime列
end loop;
end;
2..你可以在执行上面语句之前查询下伪劣
select logintime,to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd') v_logintime from uf_staffinformlogin
是否有问题
----使用备份数据表测试只需把下面的表名修改成备份数据表名即可,
declare
cursor c_cur is
select * from uf_staffinformlogin for update of logintime;
v_logintime date;
begin
for i in c_cur loop
v_logintime:=to_date(i.logintime,'yy-mm-dd'); ---- 这里是一个字符串转时间类型的转换,你需要
----测试转换是否有问题,oracle可能把11转换成1911,我这里没有测试环境不能确定
update uf_staffinformlogin set logintime=to_char(v_logintime,'yyyy-mm-dd')
where current of c_cur; --这是基于游标的更新它会锁住你的logintime列,所以你要确定你的数据
----库在你更新的时候不会修改logintime列
end loop;
end;
2..你可以在执行上面语句之前查询下伪劣
select logintime,to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd') v_logintime from uf_staffinformlogin
是否有问题
追问
你好 能不能再说点详细点呢??
追答
语句都给你写上面了,非常简单的语法,看不懂的话,我也不知道怎么在跟你说详细了
select logintime,to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd') v_logintime from uf_staffinformlogin
这条语句能够查询出你logintime 列的值和替换后生成的值,你可以查询下是否是你想要的答案
没错也可以不用,循环只是一个思路。
update uf_staffinformlogin set logintime =to_char(to_date(logintime,'yy-mm-dd'),'yyyy-mm-dd')
直接更新全部表。
不过建议你更改的时候还是先备份下表
备份表uf_staffinformlogin_bak 你可以
create table uf_staffinformlogin_bak as select * from uf_staffinformlogin
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一句SQL语句,就可以全部更新完啦。没必要循环啊
不知道看了下面的SQL,是否能对你有些启发?
SQL> SELECT
2 TO_CHAR( TO_DATE('11-6-1', 'YY-MM-DD'), 'YYYY-MM-DD') A,
3 TO_CHAR( TO_DATE('11-6-21', 'YY-MM-DD'), 'YYYY-MM-DD') B,
4 TO_CHAR( TO_DATE('11-6-27', 'YY-MM-DD'), 'YYYY-MM-DD') C
5 FROM
6 dual;
A B C
---------- ---------- ----------
2011-06-01 2011-06-21 2011-06-27
不知道看了下面的SQL,是否能对你有些启发?
SQL> SELECT
2 TO_CHAR( TO_DATE('11-6-1', 'YY-MM-DD'), 'YYYY-MM-DD') A,
3 TO_CHAR( TO_DATE('11-6-21', 'YY-MM-DD'), 'YYYY-MM-DD') B,
4 TO_CHAR( TO_DATE('11-6-27', 'YY-MM-DD'), 'YYYY-MM-DD') C
5 FROM
6 dual;
A B C
---------- ---------- ----------
2011-06-01 2011-06-21 2011-06-27
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
update 表名 set 列名=更新值
这样就可以更新指定列的所有值了。
这样就可以更新指定列的所有值了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询