MariaDB 10.3のOracle構文サポートの体験
7029 ワード
一、背景
MariaDB 10.3がリリースされてからしばらく経ちましたが、SQL_に言及されています.MODEはORACLEオプションを追加し、一部のPL/SQL文法をサポートすることができ、比較的「新鮮」な更新であるため、インストール体験し、サポート状況をテストするつもりです.
二、テスト環境
ハードウェア:CPU:i 5-8250 U(クアッドコア8スレッド)メモリ:8 GBディスク:240 GB SSD
システムプラットフォーム:win 10 x 64
データベース:MariaDB-10.3.9-winx64
三、テストデータの準備
四、oracle構文サポートのテスト
1、SQLを体験するMODE="ORACLE"
Oracleのサンプル・ドキュメントのコード(Sample 1.FOR Loop):
以上の2つの主な違いは次のとおりです.
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で変更せずに実行できるかどうかを見てみましょう. この簡単な例は正常に動作します.
2、oracleの外部関連文法をテストする
oracle専用標準の関連クエリー.2つの関連キー値の左関連SQLを例に挙げます.
ANSI規格に変換されたleft/right/full joinの書き方は以下の通りです.
試験状況:
Oracleをサポートしない(+)は、外部関連を表す構文です.
最後に
現在、MariaDBのPL/SQLに対するサポート状況を完全に量子化評価していない.oracleの外部関連文法(+)のoracleでの広範な使用については、まだサポートされていない.後続のバージョンでは、oracle文法の互換性が徐々に改善されるかもしれない.
MariaDB 10.3がリリースされてからしばらく経ちましたが、SQL_に言及されています.MODEはORACLEオプションを追加し、一部のPL/SQL文法をサポートすることができ、比較的「新鮮」な更新であるため、インストール体験し、サポート状況をテストするつもりです.
二、テスト環境
ハードウェア:CPU:i 5-8250 U(クアッドコア8スレッド)メモリ:8 GBディスク:240 GB SSD
システムプラットフォーム:win 10 x 64
データベース:MariaDB-10.3.9-winx64
三、テストデータの準備
use test;
CREATE TABLE t_A (
id int,
code int,
name VARCHAR(10)
);
CREATE TABLE t_B (
id int,
code int,
name VARCHAR(10)
);
INSERT INTO t_A(id,code,name) VALUES(1,2,'A');
INSERT INTO t_A(id,code,name) VALUES(2,1,'B');
INSERT INTO t_A(id,code,name) VALUES(3,5,'C');
INSERT INTO t_A(id,code,name) VALUES(4,6,'D');
INSERT INTO t_A(id,code,name) VALUES(5,7,'E');
INSERT INTO t_B(id,code,name) VALUES(1,3,'AA');
INSERT INTO t_B(id,code,name) VALUES(1,4,'BB');
INSERT INTO t_B(id,code,name) VALUES(2,1,'CC');
INSERT INTO t_B(id,code,name) VALUES(1,2,'DD');
INSERT INTO t_B(id,code,name) VALUES(7,5,'GG');
CREATE TABLE temp (
id int,
code int,
name VARCHAR(50)
);
四、oracle構文サポートのテスト
1、SQLを体験するMODE="ORACLE"
Oracleのサンプル・ドキュメントのコード(Sample 1.FOR Loop):
-- 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で実行するには、どのように見えるかを見てみましょう.以下はMySQL 5に変更する.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;
以上の2つの主な違いは次のとおりです.
MySQLコードはストレージ中に実行する必要がありますので、ここでdowhileを作成します.
Enter password: ******
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.3.9-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use test
Database changed
MariaDB [test]> select * from temp;
Empty set (0.003 sec)
MariaDB [test]> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------+
| sql_mode | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------+
1 row in set (0.003 sec)
MariaDB [test]> set session sql_mode="ORACLE";
Query OK, 0 rows affected (0.000 sec)
MariaDB [test]> show variables like 'sql_mode';
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.003 sec)
MariaDB [test]> delimiter /
MariaDB [test]> 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;
-> /
Query OK, 10 rows affected (0.020 sec)
MariaDB [test]> select * from temp/
+------+------+-----------+
| 1 | 2 | 3 |
+------+------+-----------+
| 1 | 100 | i is odd |
| 2 | 200 | i is even |
| 3 | 300 | i is odd |
| 4 | 400 | i is even |
| 5 | 500 | i is odd |
| 6 | 600 | i is even |
| 7 | 700 | i is odd |
| 8 | 800 | i is even |
| 9 | 900 | i is odd |
| 10 | 1000 | i is even |
+------+------+-----------+
10 rows in set (0.000 sec)
2、oracleの外部関連文法をテストする
oracle専用標準の関連クエリー.2つの関連キー値の左関連SQLを例に挙げます.
select *
from t_a a,t_b b
where a.id=b.id(+) and a.code=b.code(+)
and a.id!=8;
ANSI規格に変換されたleft/right/full joinの書き方は以下の通りです.
select *
from t_a a
left join t_b b on a.id=b.id and a.code=b.code
where a.id!=8;
試験状況:
MariaDB [test]> select *
-> from t_a a
-> left join t_b b on a.id=b.id and a.code=b.code
-> where a.id!=8;
-> /
+------+------+------+------+------+------+
| id | code | name | id | code | name |
+------+------+------+------+------+------+
| 2 | 1 | B | 2 | 1 | CC |
| 1 | 2 | A | 1 | 2 | DD |
| 3 | 5 | C | NULL | NULL | NULL |
| 4 | 6 | D | NULL | NULL | NULL |
| 5 | 7 | E | NULL | NULL | NULL |
+------+------+------+------+------+------+
5 rows in set (0.004 sec)
MariaDB [test]> select *
-> from t_a a,t_b b
-> where a.id=b.id(+) and a.code=b.code(+)
-> and a.id!=8;
-> /
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') and a.code=b.code(+)
and a.id!=8' at line 3
MariaDB [test]>
Oracleをサポートしない(+)は、外部関連を表す構文です.
最後に
現在、MariaDBのPL/SQLに対するサポート状況を完全に量子化評価していない.oracleの外部関連文法(+)のoracleでの広範な使用については、まだサポートされていない.後続のバージョンでは、oracle文法の互換性が徐々に改善されるかもしれない.