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 のオプティマイザが合理化する場合がありますが、可視性や保守性を取る方が長期的には有利。
本日、レンタルサーバー会社からドメイン料金改定(要はドメイン料金値上がり)のお知らせが届いてました。。
こんなところにも値上がりの波が!?
とメールを見てみるといきなり3割以上も値上がりしてます。。
ドメイン料金なので1年で2614円と考えれば大した金額でもないのですが、突然何故?と思っているとメール文中に「上位組織から提示されるドメイン料金の上昇」と記載されています。
上位組織?と思って調べてみたら
「.com」ドメインのレジストリ管理企業であるVerisignha社(ベリサイン社)は 2020年1月3日にICANNにより公開された「.comレジストリ契約の修正に関する発表」により、 2020年から2029年までの10年間、年間7%・最大70%値上げを行う権利を認められてるとの事。 上記に基づき、Verisign社は2021年9月1日から約7%の卸価格値上げを決定しています。
というのが背景となってました。
メール見てそのまま1年更新でいいかあ程度に考えてましたが、今後も毎年値上げが実施される可能性大というのも考慮すると今のうちに複数年契約した方が良いと判断して最大の5年契約に変更しました。
今後も「.com」ドメインを長期使用予定の方は契約年数を見直したほうがお得かも
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 を指していると、意図せずルート側に接続してしまうことがあります。
「One Commander」はファイルマネージャーアプリでWindows標準のエクスプローラーを利用している方には一度は試してもらいたいソフトの代表格です。使用したら恐らく標準のエクスプローラーには戻れませんw
そういえば標準のエクスプローラーだとWindows11でようやくタブ化されたとか。。
「One Commander」のダウンロード
覚え書き.comから「One Commander 3.5.11」をダウンロード
バージョン:3.5.11.0
ファイルサイズ:43.5M
「One Commander」の主な機能・特徴
デュアルパネル、サイドバイサイドのファイルブラウジング
エクスプローラーのタブ化や改装表示が可能
ファイル作成日の色分け表示
動画、画像、PDF、ソースコードファイルなどのプレビュー表示
お気に入り(BookMark)のグループ化
File Automatorというツールでファイル名の一括変換や画像ファイルのjpegなどへの一括変換なども可能
ライセンス
サポート
本日WordPressで作業していたら以下のような事象が発生しました。
WordPressで記事を更新しようとしても以下のように「更新が失敗しました。返答が正しいJSONレスポンスではありません。」と表示されて更新出来ない
新規で投稿や固定ページを追加しようとしても「Security check failed」と表示されて新規投稿用の画面が表示されない
先日まで投稿できてたのに何故!?
と思いエラーメッセージでググっても「クラシックエディタに変更してみる」とか「パーマリンク設定を基本にする」などは見つかりましたが今ひとつ根本的な解決手段じゃないなあと本日行った作業を思い出してみるとそういばプラグインいくつか更新したな。。と思い出し本日更新したプラグインを一つずつ無効化して確かめてたら。。
プラグイン「WP to Twitter」の更新が原因でした!!
これを無効化したら全て正常に動作したので私の場合は「プラグインの更新で不具合があった」というのが根本原因でした。。
やっぱりプラグイン更新時は動作確認必須だなあと再認識(^_^;)
WP to Twitterのページを見るとバージョン「3.6.0」に更新すると発生します。
サポートフォーラムを見てもまだこの件については何も記載されてないようなのでもう少し対応待つ必要ありそうです。
Wp to Twitterのプラグインページへ
今回は更新したプラグインで不具合があったのが原因でしたが、調べていると他の原因でも「更新が失敗しました。返答が正しいJSONレスポンスではありません。」のメッセージが表示されることがあるようです。まずは正常に更新出来ていた時期~エラーが発生した時期までに更新したことを思い出して一つずつ原因を潰すのが一番近道かなあと思います。あと定期的なバックアップも大事!
他に考えられる原因や対処方法
レンタルサーバー側でなんらかのセキュリティなどの機能が追加されたのが影響した
「.htaccees」の編集で記載ミスがあった。もしくは自動で中身がクリアされてしまっていた。
ブラウザのキャッシュをクリアしたら直った
サーバーのWAFをOFFにしたら直った
trimは通常、文字列の前後の半角スペースを削除して取得する場合に使用する場合が多いと思いますが、引数へLEADING、TRAILING、BOTHを指定することで任意の文字や文字列を削除して取得することが出来ます。
サンプルテーブル
「goods」テーブル
TRIMに引数「LEADING」を指定した場合
TRIMに引数「LEADING」を指定することで文字列の先頭にある任意の文字や文字列を削除することが出来ます。
クエリー(SQL)例
SELECT TRIM (LEADING '商品' From name ) FROM goods ORDER BY id;
実行結果
TRIMに引数「TRAILING」を指定した場合
TRIMに引数「TRAILING」を指定することで文字列の末尾にある任意の文字や文字列を削除することが出来ます。
クエリー(SQL)例
SELECT TRIM (TRAILING 'A' From name ) FROM goods ORDER BY id;
実行結果
TRIMに引数「BOTH」を指定した場合
TRIMに引数「BOTH」を指定することで文字列の先頭と末尾にある任意の文字や文字列を削除することが出来ます。
クエリー(SQL)例
SELECT TRIM (BOTH 'A' From name ) FROM goods ORDER BY id;
実行結果
Excelでxxヶ月の月末日付を取得するにはEOMONTH関数を使用することで可能となります。
xxヶ月後の月末日付を取得する方法
EOMONTH関数は「EOMONTH(開始日, 月)」の書式で指定します。
以下の例ではB1セル「本日の日付」の5ヶ月後の月末日をB2セルへ表示しています。
B2セルは日付型にして書式には「=EOMONTH(B1,5)」を入力しています。
B列の書式
SQLで大文字⇒小文字に変換する場合はLCASE関数 or LOWER関数、小文字⇒大文字へ変換するにはUCASE関数 or UPPER関数を使用します。DBMS毎で使用出来る関数が異なるので整理しておきます。
サンプルではPostgreSQLでの使用例となります。
関数\DBMS MySQL PostgreSQL SQL Server Oracle
UCASE
※小文字 ⇒ 大文字 ○ ✕ ✕ ✕
UPPER
※小文字 ⇒ 大文字 ✕ ○ ○ ○
LCASE
※大文字 ⇒ 小文字 ○ ✕ ✕ ✕
LOWER
※大文字 ⇒ 小文字 ✕ ○ ○ ○
サンプルテーブル
「goods」テーブル
UPPER関数(小文字 ⇒ 大文字へ変換)の使用例
クエリー(SQL)例
SELECT UPPER (name ) FROM goods ORDER BY id;
実行結果
LOWER関数(大文字 ⇒ 小文字へ変換)の使用例
クエリー(SQL)例
SELECT LOWER (name ) FROM goods ORDER BY id;
実行結果
投稿ナビゲーション
「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。