MariaDB 10.3 发布已经有一段时间了, 最近刚刚 RC 里面提到了 SQL_MODE 新增了 ORACLE 选项, 可以支持部分的 PL/SQL 语法, 算是一个比较新鲜的更新, 所以打算安装体验一下
目录
体验一下 SQL_MODE="ORACLE"
升级 MariaDB 10.1 到 10.3
体验一下 SQL_MODE="ORACLE"
简单体验一下, 我们在 Google 上找到 Oracle 9i 文档中 PL/SQL 示例 : Sample 1. FOR Loop
Oracle 中的示例文档中代码:
-- available online in file 'sample1' DECLARE x NUMBER := 100; BEGIN FOR i IN 1..10 LOOP IF MOD(i,2) = 0 THEN -- i is even INSERT INTO temp VALUES (i, x, 'i is even'); ELSE INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; x := x + 100; END LOOP; COMMIT; END;
首先, 我们看看如果是这样一段代码, 要在 MySQL 中运行, 应该看起来是怎样的下面是我修改的在 MySQL5.7 中运行的代码:
CREATE PROCEDURE dowhile() BEGIN DECLARE x INT DEFAULT 100; DECLARE i INT DEFAULT 1; WHILE i<= 10 DO IF MOD(i,2) = 0 THEN -- i is even INSERT INTO temp VALUES (i, x, 'i is even'); ELSE INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; COMMIT; SET x=x+100; SET i=i+1; END WHILE; END;
以上两种, 主要的不同包括:
MySQL 代码必须在一个存储过程中执行, 所以这里创建了 dowhile
DECLARE 语法不一样, Oracle DECLARE 在 BEGIN 之前, MySQL 则在 BEGIN 里面
MySQL 不支持 FOR... IN... LOOP 的语法, 这里改用 WHILE 来实现; MySQL 也不支持 "1..10" 这种写法
数据类型不同, Oracle 中是 NUMBER,MySQL 是 INT
变量赋值不同, Oracle 使用了:=,MySQL 是 SET .. = ...
我们先看看, 前一段 Oracle 的代码, 在 MariaDB 里面是否能够不做修改的运行:
这个简单的示例可以正常运行:
升级 MariaDB 10.1 到 10.3
因为之前安装 10.1 版本, 所以这次需要升级到最新的 10.3 系统是 Centos 7.4 使用的 yum 管理, 下面是大致的升级步骤
先把 yum 仓库切换成 10.3 的仓库:
/etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
删除 yum 缓存信息:
yum clean metadata
删除原来的安装的 MariaDB 软件
rpm -e MariaDB-server rpm -e MariaDB-shared MariaDB-client MariaDB-common
安装新版本的 MariaDB:
yum install mariadb-server yum install MariaDB-shared
启动并登录 MariaDB:
sudo systemctl start mariadb systemctl status mariadb.service
最后
目前还没有量化评估 MariaDB 对 PL/SQL 的支持情况, 但是, 应该算是向 Oracle 放了一个冷枪当然, 对 Oracle 来说, 这早就不是第一个支持 Oracle 语法的数据库了, 并没什么大不了的个人感觉, 对于 MariaDB 来说, 最重要应该还是拿下当前官方 MySQL 所占的份额, 这才是最大的挑战
来源: https://www.thinksaas.cn/group/topic/838875/