oracle 小知识点
数据从其他管理系统中导入到现在的管理系统中。
需要调整原数据使之符合现有数据格式,在工作中涉及oracle
pl sql的一些应用。
1、MATERIALname字段数据过长,现有系统不能接受,发现原系统数据中
有很多全角字符和空格。
使用replace()函数将字符替换:
语法:
REPLACE(’string’,’s1’,’s2’)
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
update MATERIALS1
set MATERIALname=replace(MATERIALname,'(','(') ;
update MATERIALS1
set MATERIALname=replace(MATERIALname,')',')');
用半角字符括号替换数据中的全角字符括号
update MATERIALS1
set MATERIALname=replace(MATERIALname,' ','')
删除数据中的空格
2、现在的管理系统要求materialid为20位,而源系统只是15位
使用lpad()函数填充。
语法:
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
update materials1
set materialid=lpad(rtrim(materialid),20,'0');
扩充id到20位,前边用0补齐。
3、materialsortpath字段是新系统的字段,源系统没有此字段,
通过materialcode编辑使之成为materialsortpath字段
使用字符串连接||和取字串函数substr():
语法:
SUBSTR(string,start,count)
取子字符串,从start开始,取count个
update Materials1
set materialsortpath=('00'||substr(materialcode,1,2))
where substr(materialcode,1,1)=7
4、跟新materials2(10万条记录)表的数据需要和measureunits(1万条记录)关联。
在sql server中可以这样写:
update materials2
set customfield5=unitid
from measureunits
where customfield4=unitname and flag=1
oracle中不支持update from这种格式可以使用如下格式:
update materials2
set customfield5=(select unitid from measureunits where customfield4=unitname and flag=1)
但是数据量太大,这样跟新比较慢。
我们可以使用merge来跟改数据:
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
update 例子:
MERGE INTO products p
USING newproducts np
ON (p.product_id = np.product_id)
WHEN MATCHED THEN
UPDATE
SET p.product_name = np.product_name, p.category = np.category;
INSERT 例子:
MERGE INTO products p
USING newproducts np
ON (p.product_id = np.product_id)
WHEN NOT MATCHED THEN
INSERT
VALUES (np.product_id, np.product_name, np.category);
在数据整理中使用如下语句进行跟新:
merge into materials2 a
using measureunits b
on (a.customfield4=b.unitname and b.flag=1)
when matched then
update set
a.customfield5=b.unitid;