Oracle 辞典
Oracle コースで覚える構文の一覧です。共通 SQL コースの構文(SELECT・JOIN・GROUP BY・ウィンドウ関数など)はすべて使えます。
SQL*Plus コマンドSQL*Plus 自身の命令Lv1 で覚える
DESC 表 SET SERVEROUTPUT ON SHOW USER
SQL ではないので ; は不要です。DESC で列と型、SET SERVEROUTPUT ON で DBMS_OUTPUT の表示が有効になります。
DESC emp SET SERVEROUTPUT ON
DUAL計算だけをする 1 行の表Lv1 で覚える
SELECT 式 FROM DUAL;
Oracle では FROM が必須なので、計算や関数の結果だけを見るときに DUAL 表を使います。
SELECT SYSDATE FROM DUAL; SELECT 3 * 4 FROM DUAL;
NVL / NVL2NULL を置き換える(Oracle)Lv3 で覚える
NVL(値, 代わりの値) NVL2(値, NULL でないとき, NULL のとき)
COALESCE の Oracle 版です。
SELECT NVL(commission, 0) FROM emp;
DECODE値で場合分け(Oracle)Lv3 で覚える
DECODE(値, 候補1, 結果1, 候補2, 結果2, …, 既定)
単純 CASE の Oracle 版です。最後の引数が既定値(なければ NULL)。
SELECT DECODE(dept_id, 10, '開発', 20, '営業', 'その他') FROM emp;
ROWNUM行番号(Oracle)Lv5 で覚える
WHERE ROWNUM <= n SELECT * FROM (SELECT … ORDER BY …) WHERE ROWNUM <= n
取り出した順に 1, 2, 3 … と付く番号。ORDER BY より先に付くので、上位 n 件は副問い合わせで並べてから ROWNUM で絞ります。
SELECT * FROM (SELECT * FROM emp ORDER BY salary DESC) WHERE ROWNUM <= 3;
(+) の外部結合Oracle の古い外部結合Lv6 で覚える
FROM a, b WHERE a.列 = b.列(+)
(+) を付けた側が「相手がいなければ NULL」になります。a.列 = b.列(+) は a LEFT JOIN b と同じ。
SELECT e.name, d.name FROM emp e, dept d WHERE e.dept_id = d.dept_id(+);
シーケンス番号を出す仕組みLv7 で覚える
CREATE SEQUENCE 名前 [START WITH n] [INCREMENT BY n];
nextval('名前') currval('名前') setval('名前', n)
名前.NEXTVAL / 名前.CURRVAL(Oracle)呼ぶたびに次の番号を返します。SERIAL や IDENTITY も中ではシーケンスを使っています。
SELECT nextval('order_no');CONNECT BY階層をたどる(Oracle)Lv8 で覚える
SELECT LEVEL, … FROM 表 START WITH 根の条件 CONNECT BY PRIOR 親の列 = 子の列 ORDER SIBLINGS BY 列 SYS_CONNECT_BY_PATH(列, '/') SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= n
組織図のような木をたどります。LEVEL は深さ。PRIOR を付けた側が親です。
SELECT LPAD(' ', (LEVEL - 1) * 2) || name FROM emp START WITH manager_id IS NULL CONNECT BY PRIOR emp_id = manager_id;MERGEあれば更新・なければ追加(Oracle)Lv9 で覚える
MERGE INTO 表 t USING 元 s ON (t.id = s.id) WHEN MATCHED THEN UPDATE SET … WHEN NOT MATCHED THEN INSERT (…) VALUES (…);
2 つの表を突き合わせて、更新と追加を一度に行います。
PL/SQL ブロック手続きを書く(Oracle)Lv13 で覚える
DECLARE 変数 型 := 値; BEGIN … EXCEPTION … END; /
最後に / だけの行を入れると実行されます。変数への代入は :=、SELECT … INTO 変数 で値を受け取ります。IF・LOOP・FOR が使えます。
BEGIN
DBMS_OUTPUT.PUT_LINE('hello');
END;
/DBMS_OUTPUT画面に表示する(Oracle)Lv13 で覚える
SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE(値);
PL/SQL の中から表示します。先に SET SERVEROUTPUT ON をしないと何も出ません。
カーソル問い合わせの結果を 1 行ずつ(Oracle)Lv15 で覚える
FOR r IN (SELECT …) LOOP … END LOOP; CURSOR c IS SELECT …; OPEN c; FETCH c INTO …; EXIT WHEN c%NOTFOUND; CLOSE c;
FOR … IN ループが一番簡単です。r.列 で各行の値を使います。%ROWTYPE で 1 行分の変数を宣言できます。
例外処理エラーを受け止める(Oracle)Lv16 で覚える
EXCEPTION WHEN NO_DATA_FOUND THEN … WHEN OTHERS THEN … RAISE_APPLICATION_ERROR(-20001, 'メッセージ');
NO_DATA_FOUND(0 行)、TOO_MANY_ROWS(2 行以上)、ZERO_DIVIDE(0 で割る)、OTHERS(その他すべて)。SQLERRM でメッセージ。
プロシージャ・ファンクション名前をつけて保存する PL/SQL(Oracle)Lv17 で覚える
CREATE OR REPLACE PROCEDURE 名前 (引数 IN 型) IS 宣言 BEGIN … END; / CREATE OR REPLACE FUNCTION 名前 (引数 型) RETURN 型 IS BEGIN … RETURN 値; END; / EXEC 名前(引数)
プロシージャは EXEC で実行、ファンクションは SELECT の中で値として使えます。
トリガー変更のたびに自動で動くLv19 で覚える
PostgreSQL: CREATE FUNCTION f() RETURNS trigger … ; CREATE TRIGGER t BEFORE UPDATE ON 表 FOR EACH ROW EXECUTE FUNCTION f(); Oracle: CREATE OR REPLACE TRIGGER t BEFORE INSERT ON 表 FOR EACH ROW BEGIN … END; /
INSERT・UPDATE・DELETE の前後に処理を入れます。NEW は新しい行、OLD は古い行(Oracle は :NEW / :OLD)。