oracle merge into ora 00905,oracle 10g merge命令的增强

merge into 语句写法主要功能是对两个表进行关联,如果存在相等值就更新,

不存在就插入

先看9i写法:

create table test (id number,name varchar2(20));

create table paul (id number,name varchar2(50));

insert into test values(10,'abcd');

insert into paul values(5,'def');

insert into test values(1,'right');

insert into paul values(1,'false');

SQL> select * from paul;

ID NAME

---------- --------------------------------------------------

5 def

1 false

SQL> select * from test;

ID NAME

---------- --------------------

10 abcd

1 right

SQL>

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4    WHEN MATCHED THEN

5      UPDATE SET a.name = b.name

6    WHEN NOT MATCHED THEN

7      INSERT (id, name)

8      VALUES (b.id, b.name)

9  ;

Done

SQL> select *  from test;

ID NAME

---------- --------------------

10 abcd

1 false

5 def

SQL>

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4   WHEN NOT MATCHED THEN

5      INSERT (id, name)

6      VALUES (b.id, b.name);

MERGE INTO test a

USING paul b

ON (a.id = b.id)

WHEN NOT MATCHED THEN

INSERT (id, name)

VALUES (b.id, b.name)

ORA-00905: missing keyword

SQL>

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4    WHEN MATCHED THEN

5      UPDATE SET a.name = b.name;

MERGE INTO test a

USING paul b

ON (a.id = b.id)

WHEN MATCHED THEN

UPDATE SET a.name = b.name

ORA-00905: missing keyword

可以看出在9i中对单一的进行insert 或update 分开是不行的

10g 上就可以了:

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL>

SQL> create table test (id number,name varchar2(20));

Table created

SQL> create table paul (id number,name varchar2(50));

Table created

SQL> insert into test values(10,'abcd');

1 row inserted

SQL> insert into paul values(5,'def');

1 row inserted

SQL> insert into test values(1,'right');

1 row inserted

SQL> insert into paul values(1,'false');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from paul;

ID NAME

---------- --------------------------------------------------

5 def

1 false

SQL> select * from test;

ID NAME

---------- --------------------

10 abcd

1 right

SQL>

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4    WHEN MATCHED THEN

5      UPDATE SET a.name = b.name

6    WHEN NOT MATCHED THEN

7      INSERT (id, name)

8      VALUES (b.id, b.name)

9  ;

Done

SQL> select * from test;

ID NAME

---------- --------------------

10 abcd

1 false

5 def

SQL> rollback;

Rollback complete

SQL>

单独的insert

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4   WHEN NOT MATCHED THEN

5      INSERT (id, name)

6      VALUES (b.id, b.name);

Done

SQL> select * from test;

ID NAME

---------- --------------------

10 abcd

1 right

5 def

SQL> rollback;

Rollback complete

单独的update

SQL>

SQL> MERGE INTO test a

2    USING paul b

3      ON (a.id = b.id)

4    WHEN MATCHED THEN

5      UPDATE SET a.name = b.name;

Done

SQL> select * from test;

ID NAME

---------- --------------------

10 abcd

1 false

还可以增加where 条件和delete条件

Conditional Operations

Conditional inserts and updates are now possible by using a WHERE clause on these statements.

-- Both clauses present.

MERGE INTO test1 a

USING all_objects b

ON (a.object_id = b.object_id)

WHEN MATCHED THEN

UPDATE SET a.status = b.status

WHERE b.status != 'VALID'

WHEN NOT MATCHED THEN

INSERT (object_id, status)

VALUES (b.object_id, b.status)

WHERE b.status != 'VALID';

-- No matched clause, insert only.

MERGE INTO test1 a

USING all_objects b

ON (a.object_id = b.object_id)

WHEN NOT MATCHED THEN

INSERT (object_id, status)

VALUES (b.object_id, b.status)

WHERE b.status != 'VALID';

-- No not-matched clause, update only.

MERGE INTO test1 a

USING all_objects b

ON (a.object_id = b.object_id)

WHEN MATCHED THEN

UPDATE SET a.status = b.status

WHERE b.status != 'VALID';

DELETE Clause

An optional DELETE WHERE clause can be used to clean up after a merge operation. Only those rows which match both the ON clause and the DELETE WHERE clause are deleted.

MERGE INTO test1 a

USING all_objects b

ON (a.object_id = b.object_id)

WHEN MATCHED THEN

UPDATE SET a.status = b.status

WHERE b.status != 'VALID'

DELETE WHERE (b.status = 'VALID');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值