/*
创建新表
用COURSE表为模板,创建一张新表COURSE_NEW,并且包括COURSE表的所有记录。
*/
--删除已存在的表
DROP TABLE course_new;
CREATE TABLE course_new AS SELECT * FROM COURSE;
select * from course_new
/*
清空COURSE_NEW表中的所有记录。
*/
TRUNCATE TABLE course_new;
/*
往COURSE_NEW表中增加以下记录:
NO COURSE_NAME
A001 ORACLE数据库管理
A002 SQLSERVER安全指南
A003 Hibernate全攻略
A004 .NET
*/
insert into course_new
SELECT 'A001','ORACLE数据库管理 ' FROM DUAL
UNION SELECT 'A002','SQLSERVER安全指南' FROM DUAL
UNION SELECT 'A003','Hibernate全攻略' FROM DUAL
UNION SELECT 'A004','.NET' FROM DUAL;
commit;
--根据COURSE表中的NO字段,用COURSE_NEW更新COURSE表。
UPDATE
(SELECT /*+ BYPASS_UJVC */A.COURSE_NAME,B.COURSE_NAME AS BCOURSE_NAME
FROM COURSE A,COURSE_NEW B
WHERE A.COURSE_NO=B.COURSE_NO)
SET COURSE_NAME=BCOURSE_NAME;
--2:
UPDATE COURSE A SET (A.COURSE_NO,A.COURSE_NAME)=
(SELECT B.COURSE_NO,B.COURSE_NAME
FROM COURSE_NEW B
WHERE A.COURSE_NO=B.COURSE_NO
AND ROWNUM<2)
WHERE EXISTS(SELECT 1 FROM COURSE_NEW B WHERE A.COURSE_NO=B.COURSE_NO);
COMMIT;
/*
分别使用INSERT/UPDATE和MERGE命令实现,用COURSE_NEW更新COURSE表中的记录,如果存在,则更新,不存在测INSERT。*/
--使用INSERT/UPDATE
UPDATE
(SELECT /*+ BYPASS_UJVC */A.COURSE_NAME,B.COURSE_NAME AS BCOURSE_NAME
FROM COURSE A,COURSE_NEW B
WHERE A.COURSE_NO=B.COURSE_NO)
SET COURSE_NAME=BCOURSE_NAME;
INSERT INTO COURSE
SELECT * FROM COURSE_NEW A
WHERE NOT EXISTS(SELECT 1 FROM COURSE B WHERE A.COURSE_NO=B.COURSE_NO);
COMMIT;
--MERGE命令实现
MERGE INTO COURSE A
USING COURSE_NEW B ON (A.COURSE_NO=B.COURSE_NO)
WHEN MATCHED THEN
UPDATE SET COURSE_NAME=B.COURSE_NAME
WHEN NOT MATCHED THEN
INSERT (A.COURSE_NO,A.COURSE_NAME)
VALUES (B.COURSE_NO,B.COURSE_NAME);
--用一组语句代替对实现对全表的更新操作。
CREATE TABLE COURSE_TMP AS SELECT * FROM COURSE_NEW;
TRUNCATE TABLE COURSE_NEW;
INSERT /*+APPEND */ INTO COURSE_NEW
SELECT COURSE_NO,'ABC' FROM COURSE_TMP;
COMMIT;
DROP TABLE COURSE_TMP;
--代替delete FROM COURSE_NEW WHERE COURSE_NO>'A001' OR COURSE_NO<'A001'
CREATE TABLE COURSE_TMP AS SELECT * FROM COURSE_NEW WHERE COURSE_NO='A001'
TRUNCATE TABLE COURSE_NEW;
INSERT /*+APPEND */ INTO COURSE_NEW
SELECT * FROM COURSE_TMP;
COMMIT;
DROP TABLE COURSE_TMP;