
我就简单说点例子:
Oracle 可以执行匿名的代码段,例如:
SQL> set serveroutput on
SQL> BEGIN
2 dbms_output.put_line('Hello World');
3 END;
4 /
Hello World
MySQL 不能执行匿名的,必须创建存储过程
Oracle 可以 在2个表之间 MERGE ,如果有数据则更新,没有则插入。
-- 源表
CREATE TABLE test_from (id INT, val VARCHAR(20));
-- 目标表
CREATE TABLE test_to (id INT, val VARCHAR(20));
-- 插入源表
INSERT INTO test_from VALUES (1, 'A');
INSERT INTO test_from VALUES (2, 'B');
-- 合并 源表到目标表
MERGE INTO test_to
USING test_from
ON ( test_to.id = test_from.id ) -- 条件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的时候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入
MySQL 好像没有。
Oracle 支持 Check 约束
SQL> CREATE TABLE test_create_tab4 (
2 id INT PRIMARY KEY,
3 val VARCHAR(10)
4 CONSTRAINT test_tab4_val_nn NOT NULL,
5 val2 INT,
6 CONSTRAINT test_tab4_val2_100 CHECK(val2 >= 0 AND val2 <= 100)
7 );
MySQL Check 只是用来看的。
Oracle
使用 START WITH CONNECT BY 语句实现树状查询
MySQL 不知道有没有。
Oracle
INTERSECT – 仅仅给出2个表都有的数据(去除重复记录)
MINUS 返回第一个表中有、第二个表中没有的数据
MySQL 好像是没这功能
Oracle
支持 CREATE VIEW 。。。 WITH READ ONLY;
MySQL 不知道有没有。
Oracle
触发器有2种 一种语句级别的 一种行级的 FOR EACH ROW
MySQL
只有 FOR EACH ROW 级别的 不支持一个触发器 同时处理 INSERT UPDATE DELETE 触发器
Oracle GROUP BY ROLLUP 的时候, 有个 GROUPING 函数
MySQL 也可以 WITH ROLLUP, 不过 GROUPING 好像没有。
Oracle 支持 CUBE
MySQL 好像没有
Oracle 可以按 拼音/笔画 排序
-- 按照拼音来排序
SQL> SELECT
2 *
3 FROM
4 Tab
5 ORDER BY NLSSORT(val, 'NLS_SORT=SCHINESE_PINYIN_M');
-- 按照笔画数来排序
SQL> SELECT
2 *
3 FROM
4 Tab
5 ORDER BY NLSSORT(val, 'NLS_SORT=SCHINESE_STROKE_M');
MySQL 好像没有笔画的
Oracle 可以存储过程里面抛异常
-- 错误代码允许的范围是 -20,000~20,999
RAISE_APPLICATION_ERROR(-20000, 'My Error Happen!');
MySQL 好像没有
Oracle 有 自治事务
PRAGMA AUTONOMOUS_TRANSACTION;
MySQL 好像没有
Oracle 支持 Flashback Query
也就是错误更新/删除的
可以通过 AS OF TIMESTAMP TO_TIMESTAMP 查询更新/删除 之前的数据。
这个 MySQL 好像也没有
-----
最后
Oracle 卖得很贵很贵
MySQL 这个真没有......
