重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以用游标来执行更新,也可以用update语句更新。
目前成都创新互联已为近1000家的企业提供了网站建设、域名、雅安服务器托管、网站运营、企业网站设计、瑞丽网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
但是oracle没有update from语句,可以用子查询来给源数据表的字段赋值,如果需要赋多个值的话,则用括号括起来,格式:
update table_name
set (field1, field2, ... ) = (select value1, value2, ... from source_table)
where ...
而where条件中则可以用exists测试是否要更新记录。更新语句大概这样:
update A s1
set a5 = (select b6
from B s2
where s2.b1 = s1.a1 and s2.b2 = s1.a2 and s2.b3 = s1.a3 and rownum = 1)
where exists (
select b6
from B s2
where s2.b1 = s1.a1 and s2.b2 = s1.a2 and s2.b3 = s1.a3 and rownum = 1
)
即赋值子句和where条件是类似的。
看具体怎么更新了,一般语法是:
update 表名 set 字段='xxx' where 条件;
commit;
这个所有数据库基本一致,都是这个语法
先建立一个结构一模一样的表emp1,并为其插入部分数据
create table emp1
as
select * from emp where deptno = 20;
update掉emp1中的部分数据
update emp1
set sal = sal 100,
comm = nvl(comm,0) 50
然后我们试着使用emp1中数据来更新emp中sal 和 comm这两列数据。
我们可以这么写
Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)
请你尤其注意这里的where子句,你可以尝试不写where子句来执行以下这句话,你将会使得emp中的很多值变成空。
这是因为在oracle的update语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。
我们还还可以这么写:
update (select a.sal asal,b.sal bsal,a.comm acomm,
b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;
这里的表是一个类视图。当然你执行时可能会遇到如下错误:
ERROR 位于第 2 行:
ORA-01779: 无法修改与非键值保存表对应的列
这是因为新建的表emp1还没有主键的缘故
下面增加一个主键
alter table emp1
add constraint pk_emp1 primary key (empno);
执行之后
在执行前面的语句就能成功。
这里我们总结一下:
在oracle中不存在update from结构,所以遇到需要从另外一个表来更新本表的值的问题的时候,有两种解决的办法:
一种是使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值。
另外一种是类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一型。
操作步骤如下:
准备数据:在excel中构造出需要的数据
2.将excel中的数据另存为文本文件(有制表符分隔的)
3.将新保存到文本文件中的数据导入到pl*sql中
在pl*sql中选择tools--text
importer,在出现的窗口中选择"Data
from
Textfile",然后再选择"Open
data
file",
在弹出的文件选择框中选中保存有数据的文本文件,此时将会看到data
from
textfile中显示将要导入的数据
4.在configuration中进行如下配置
注:如果不将"Name
in
header"勾选上会导致字段名也当做记录被导入到数据库中,从而导致数据错误
5.点击data
to
oracle,选择将要导入数据的表,并在fields中将文本中的字段与表中的字段进行关联
6.点击import按钮进行导入
7.查看导入的数据
OK,至此数据导入成功。