SQLでゼロ埋めスペース埋めして桁数を揃えたい場合にはLPAD関数やRPAD関数を使用することで取得可能となります。DBMSによっては使用出来ないものもあります。
関数\DBMS MySQL PostgreSQL SQL Server Oracle
LPAD ○ ○ ✕ ○
RPAD ○ ○ ✕ ○
書式は「LPAD(列名,バイト数,’埋め込み文字’)」、「RPAD(列名,バイト数,’埋め込み文字’)」で指定します。第三引数の埋め込み文字を省略すると半角スペースが埋め込まれます。
サンプルではOracleでの使用例となります。
サンプルテーブル
「GOODS」テーブル
LPAD関数の使用例1
項目「GOODS_CODE」を10桁でゼロ埋めするSQL(クエリー)
SELECT LPAD (g.GOODS_CODE , 10, '0' ) FROM USER1.GOODS g;
実行結果
LPAD関数の使用例2
項目「GOODS_CODE」を10桁で全角「*」埋めするSQL(クエリー)
SELECT LPAD (g.NAME , 10, '*' ) FROM USER1.GOODS g;
実行結果 以下のように埋め込み文字へ全角文字を指定すると1文字=2バイト扱いで埋め込まれます。
RPAD関数の使用例1
項目「GOODS_CODE」を10桁でゼロ埋めするSQL(クエリー)
SELECT RPAD (g.GOODS_CODE , 10, '0' ) FROM USER1.GOODS g;
実行結果
RPAD関数の使用例2
項目「GOODS_CODE」を10桁で全角「*」埋めするSQL(クエリー)
SELECT RPAD (g.NAME , 10, '*' ) FROM USER1.GOODS g;
実行結果 RPADでも以下のように埋め込み文字へ全角文字を指定すると1文字=2バイト扱いで埋め込まれます。
SQLを見てるとたまにWHERE句内で「(+)」と記載されているのを見かけることがあります。
この「(+)」はOracle独自で記載が可能となる外部結合演算子といって、「g.GOODS_CODE = gt.GOODS_CODE(+)」のように指定するとLEFT OUTER JOINと同じ結果を取得することが出来ます。
サンプルテーブル
「GOODS」テーブル
「GOODS_TYPE」テーブル
外部結合演算子を利用したクエリー(SQL)例
SELECT g.name, gt.type_name
FROM USER1.GOODS g, USER1.GOODS_TYPE gt
WHERE g.GOODS_CODE = gt.GOODS_CODE(+);
通常の左外部結合でのクエリー(SQL)例
SELECT g.name, gt.type_name
FROM USER1.GOODS g
LEFT OUTER JOIN USER1.GOODS_TYPE gt ON g.GOODS_CODE = gt.GOODS_CODE;
実行結果
外部結合演算子、左外部結合どちらも同じ結果となります。
補足
「(+)」演算子の歴史的背景 Oracle の古いバージョンからサポートされていた外部結合の書き方で、ANSI SQL 標準が普及する以前によく使われていました。ANSI 標準(LEFT JOIN / RIGHT JOIN / FULL OUTER JOIN)が登場して以降は、可読性・移植性の観点から推奨されないことが多いです。
制限・注意点
可読性・保守性 :g.GOODS_CODE = gt.GOODS_CODE(+) のような記述は、JOIN の方向やどのテーブルに外部結合をかけているかが分かりにくく、後でクエリを読む人が迷いやすいです。
複雑な結合 :複数テーブルを結合する場合、どこに (+) を付けるか、また付け方によって結果が変わるため、注意深く設計する必要があります。
NULL の扱い :外部結合によって NULL が返る行が含まれますが、条件節で他の条件と組み合わせると意図しない行の除外が起きることがあります(例えば WHERE 節で AND 条件として別の非 NULL 条件を加えると外部結合の意味が薄れる等)。
ANSI 標準との違い
項目 (+) 外部結合演算子 ANSI SQL 外部結合 (LEFT OUTER JOIN 等)
可読性 やや分かりにくい 比較的分かりやすい
移植性 Oracle に依存 多くの RDBMS でサポートされる
複雑な JOIN の組み立て エラーや誤解の元になりやすい ON 句で明示的に指定できるため制御しやすい
サポート状況 最新 Oracle でも非推奨の方向 推奨される方式
現代のベストプラクティス
新規開発では ANSI SQL の外部結合構文 を使うことを推奨。可読性や他 DBMS への移植性が高いため。
既存システムで (+) を使っているなら、リファクタリングやドキュメント整備を行い、「なぜこの構文になっているか」「どのような影響があるか」を明らかにしておく。
テストを用意して、クエリ変更後に結果が同じになることを検証する(特に NULL の扱いや結合の漏れが起きていないか)。
実際の書き換え例
旧構文を ANSI 標準に書き換えるときの例をもう一つ:
互換性・移行のヒント
Oracle のバージョンによっては (+) 構文が将来削除される可能性があり、非推奨の警告が出ることもあります。
他の RDBMS(PostgreSQL、MySQL、SQL Serverなど)で同じSQLを使うことを想定するなら、ANSI JOINに統一しておくと移行がスムーズです。
クエリのパフォーマンスにも注意。古い構文でも Oracle のオプティマイザが合理化する場合がありますが、可視性や保守性を取る方が長期的には有利。
Oracleのインストール後にSQL*Plusなどでユーザー作成しようとした際、「ORA-65096」エラーが発生した場合の原因と対応方法についてメモしておきます。
「ORA-65096:共通ユーザーまたはロール名が無効です」の原因
ルートコンテナにローカルユーザーを作成しようとした場合に発生するエラーとなります。 ルートコンテナには共有ユーザー(common user) と呼ばれる特殊なユーザーしか作成することはできません。 Oracle 11gまでと違いOracle 12c以降からは一つのインスタンスには一つのコンテナ・データベース(CDB)と、プラガブル・データベース(PDB)と呼ばれる子DBが存在しています。sysなどのユーザーでログイン直後はコンテナ・データベース(CDB)に接続されている状態となっているため、そのままローカルユーザーを作成しようとしてもエラーが発生してしまうということになります。
「ORA-65096:共通ユーザーまたはロール名が無効です」の対処方法
原因が分かってしまえば対応はシンプルです。接続先がコンテナ・データベース(CDB)であるのがまずいのであればプラガブル・データベース(PDB)に変更してしまえばいいだけです。
まずは「show con_name;」で現在接続されているデータベースを確認します。
次に「select name, open_mode from v$pdbs;」でPDBの名前と現在のOPEN_MODEを確認します。
PDBの名前が「ORCLPDB」というのがわかったのでデータベースの接続先を「ORCLPDB」へ変更します。
もう一度「show con_name;」を実行して接続先が変更されていることを確認します。
接続先がPDBへ変更されたのでもう一度ユーザー作成を実行すると正常に実行されます。
🔍補足:ORA-65096エラーの仕組みと注意点
ORA-65096: invalid common user or role name は、マルチテナント構成の Oracle Database(12c以降) において、ルートコンテナ(CDB$ROOT)上でローカルユーザーを作成しようとした場合 に発生するエラーです。 以下のポイントを押さえておくと、再発を防ぎやすくなります。
観点
内容
エラーの本質
共通ユーザーとローカルユーザーの区別を誤ったことによる構文エラー
共通ユーザー名の規則
C## または c## のプレフィックスが必須(COMMON_USER_PREFIXパラメータで変更可)
発生条件
CDB$ROOT に接続したままユーザーを作成/命名規則を満たさない場合
解決策
ALTER SESSION SET CONTAINER = <PDB名> でPDBに切り替えてから CREATE USER を実行する
参考
SHOW CON_NAME; で現在の接続先(コンテナ)を確認可能
✅ 具体例:安全なユーザー作成手順
もしルートコンテナ側で共通ユーザーを作成したい場合は、以下のようにします。
💡補足メモ
SHOW PDBS; で現在のPDB一覧を確認可能。OPEN_MODE が READ WRITE でなければユーザー作成はできません。
バージョン19c以降では、CDB構成がデフォルトのため、PDB接続の意識が必須 です。
TNS接続文字列(SERVICE_NAME)が CDB を指していると、意図せずルート側に接続してしまうことがあります。
データベース製品のライセンス一覧です。
製品名 オープンソース/商用 ライセンス データ
モデル 料金
DB2 商用 IBM ORDBMS 1プロセッサ
・461万7000円
2年目から5年目の保守料
・88万700円/年
1プロセッサで5年間運用した場合のコスト
・813万9800円
HiRDB 商用 日立製作所 RDBMS 同時接続数ライセンス
・120,000円
1プロセッサ
・1,800,000円
MySQL オープンソース GPL or 商用 RDBMS 1-4 ソケットサーバー 1台/年(税抜)
・Standard Edition:240,000
・Enterprise Edition:600,000
・Cluster Carrier Grade Edition:1,200,000
5+ ソケット・サーバー/年(税抜)
・Standard Edition:480,000
・Enterprise Edition:1,200,000
・Cluster Carrier Grade Edition:2,400,000
Oracle Database 商用 オラクル RDBMS
PostgreSQL オープンソース BSD ORDBMS 無料
Oracleデータベースのリカバリとリストアの概念が少し理解しずらかったので整理しておこうと思います。
基本的にはパソコンのOSなどにおけるリカバリ(復旧)/リストア(復元)と言葉的な概念は同じですが、実作業は異なるものだと別物と覚えたほうが良さそうです。
リストアとは
一般的にパソコンのリストアといえばバックアップデータを用いてOSなどのデータを元の状態に戻す(復元)することを指します。
Oracleデータベースのリストアとは、バックアップ媒体から元の場所もしくは新しい場所へデータベースを構成する物理ファイルをコピーして復元することを指します。
リカバリとは
一般的にパソコンのリカバリといえばパソコンにインストールされているOSを出荷時の状態に戻す(復旧する)作業のことをいいます。
Oracleデータベースのリカバリとは、REDOログファイル(バックアップ取得~現在までのトランザクションの変更情報が保存されています)を使用してバックアップ後に作成されたデータベースへ変更情報を反映してデータを復旧することを指します。
テーブルのデータを削除する方法として「DELETE」コマンドと「TRUNCATE TABLE」コマンドの2つがあります。
両者を使用する場合、どのような用途で使用するべきか違いについてまとめておきます。
DELETE文
TRUNCATE文
ちょっとした案件でデータベースというとMySQLをとりあえず使っておこうという人はそれなりにいたかと思いますが、いまはその状況が変わってきています。
MySQLのオリジナルコードの作者のひとりがMySQLのコードをフォークして新しいプロジェクトを立ち上げたからです。
MariaDBという新しいデータベースプロジェクトです。MySQLと互換性も高く機能の取り込みも早いとの話です。
GoogleもMySQLからMariaDBに乗り換えたという話が出てきています。
よく使われるLinuxディストリビューションのひとつであるCentOSの標準環境もMySQLからMariaDBに変わりました。バージョン7からです。
CentOSだけではなくFedoraなどもMariaDBを標準に採用しているということだそうです。このことからもわかるとおりにMySQLからMariaDBへの移行が進んでいます。
CentOSさえもMariaDBを標準で採用したことからもわかるとおりに、この流れは止まらないことでしょう。
もしも乗り換える際は当たり前の話ですがきちんと検証してから使っていきたいですね。
現代は顧客の情報や、企業の商品の情報など様々な情報がデーターベースに記録されています。
このデーターベースは、企業活動や社会活動の中で非常に大きな役割を果たしており、それなしでは今の情報化社会を営んでいくにあたり大きな支障をきたすことになります。
それゆえに、そのバックアップを取得し万が一の事態へ備えることは非常に重要なことになります。
データーベースのバックアップ方法は大きくコールドバックアップ(オフラインバックアップ)とオンラインバックアップの二種類に分けられる。
コールドバックアップとは、データーベースを停止(Shutdown)させて取得するバックアップのことであり、オンラインバックアップとはデーターベースを停止させない状態のまま取得するバックアップのことである。
コールドバックアップではデーターベースを停止させるため、その間データーベースへのアクセスが出来なくなるというデメリットはあるが、データーベースを停止させ、その時の状態を取得することで、障害時にはこのバックアップのみ使用し、簡単迅速にリカバリできるというメリットがあります。
これに対してオンラインバックアップではデーターベースを停止させないため、サービスを運用状態でバックアップが取れるが、障害時はバックアップデータに加えてアーカイブログが必要となるなど、リカバリに手間と時間がかかる問題があります。
どちらも一長一短ですが、上手く目的に応じて両方を組み合わせるなど適切な方法を使用していきたいものです。
PostgreSQLのバージョンは「9.1.14」の様に2つのピリオドに区切られた3つの数字で表記されています。
左から2つは、メジャーバージョンを表し、最後の1つはマイナーバージョンを表しています。
例えば、9.1.14なら、メジャーバージョンが9.1、マイナーバージョンが14となります。
メジャーバージョンアップは1年毎、マイナーバージョンアップは、年に3回~5回程度実施されます。
このバージョンをアップすることを維持管理と呼び、2015年1月27日現在で維持管理の対象となっているのは、9.4.0、9.3.5、9.2.9、9.1.14、9.0.18となります。
左端が8の8.4.22以前のものは、ダウンロードができます(available)が、維持管理の対象外(No longer supported)であり、これ以降はバージョンのアップは行われません。
維持管理対象外のバージョンは、「EOL’d releases」とも呼ばれています。EOLは「End-of-life」の略です。
マイナーバージョンアップは、バイナリ変更だけで対応できますが、メジャーバージョンアップでは、データファイルの移行の必要があるので、メジャーアップデート作業はアップデート計画に沿って、慎重に(シュミュレーション・予行演習など)行うことが大切となります。
投稿ナビゲーション
「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。