SQL PlusやSQL Developerに用意されている「DESCRIBE」コマンドを使用することでテーブル構造を確認することが出来ます。
DESCRIBEコマンドはDESCと省略することも出来ます。
SQL PlusでのDESCRIBEコマンド実行例
- 「DESCRIBE テーブル名」でテーブル構造が確認できます。
DBクライアントソフトなどでOracle DBへ接続時に「ORA-01109:データベースがオープンされていません。」が表示された場合の原因と対応方法についてメモしておきます。
上記の対応だけで解決しない場合や、環境によっては以下のようなケースもあるので参考にしてください。
ALTER PLUGGABLE DATABASE ALL SAVE STATE; を実行しても、再起動後に PDB が自動的にオープンされないことがあります。
その際は以下を確認してみてください。
ENABLE_PLUGGABLE_DATABASE が設定されているかPDB を開こうとしたときに ORA-01031: insufficient privileges が出る場合は、権限不足の可能性があります。SYSDBA 権限を持つユーザーで接続して実行する必要があります。
今の状態を確認したいときは、次のコマンドを使うと便利です。
|
1 2 3 4 |
```sql SELECT name, open_mode FROM v$pdbs; -- または SELECT name, status FROM dba_pdbs; |
READ WRITE であればオープン済み、MOUNTED ならまだ開いていない状態です。
もし原因が分からない場合は、アラートログ(alert log)や trace ファイルを確認してみてください。
「ファイルが読み込めない」「整合性が取れていない」といったエラーが記録されていることもあります。
Data Guard や RAC のような構成では、PDB のオープン状態が自動で引き継がれないことがあります。
フェイルオーバー後に PDB が閉じたままになるケースもあるので注意が必要です。
今回の ORA-01109 以外にも、以下のエラーが一緒に出ることがあります。
ORA-01110
ORA-01113
これらも「データベースがオープンされていない」状態に関係するため、併せて確認してみてください。
SQLでゼロ埋めスペース埋めして桁数を揃えたい場合にはLPAD関数やRPAD関数を使用することで取得可能となります。DBMSによっては使用出来ないものもあります。
関数\DBMS MySQL PostgreSQL SQL Server Oracle
LPAD ○ ○ ✕ ○
RPAD ○ ○ ✕ ○
書式は「LPAD(列名,バイト数,’埋め込み文字’)」、「RPAD(列名,バイト数,’埋め込み文字’)」で指定します。第三引数の埋め込み文字を省略すると半角スペースが埋め込まれます。
サンプルではOracleでの使用例となります。
|
1 |
SELECT LPAD(g.NAME , 10, '*') FROM USER1.GOODS g; |
SQLを見てるとたまにWHERE句内で「(+)」と記載されているのを見かけることがあります。
この「(+)」はOracle独自で記載が可能となる外部結合演算子といって、「g.GOODS_CODE = gt.GOODS_CODE(+)」のように指定するとLEFT OUTER JOINと同じ結果を取得することが出来ます。
|
1 2 3 |
SELECT g.name, gt.type_name FROM USER1.GOODS g, USER1.GOODS_TYPE gt WHERE g.GOODS_CODE = gt.GOODS_CODE(+); |
|
1 2 3 |
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」エラーが発生した場合の原因と対応方法についてメモしておきます。
原因が分かってしまえば対応はシンプルです。接続先がコンテナ・データベース(CDB)であるのがまずいのであればプラガブル・データベース(PDB)に変更してしまえばいいだけです。
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でようやくタブ化されたとか。。
覚え書き.comから「One Commander 3.5.11」をダウンロード
Twitterで開発者アカウント取得後、「API Key」、「API Key Secret」、「Access Token」、「Access Token Secret」を確認する手順をメモしておきます。
※事前にTwitterの開発者アカウント取得済を前提としてます。
※「API Key」、「API Key Secret」の確認方法の1~2までは同じ手順です。
本日WordPressで作業していたら以下のような事象が発生しました。
先日まで投稿できてたのに何故!?
と思いエラーメッセージでググっても「クラシックエディタに変更してみる」とか「パーマリンク設定を基本にする」などは見つかりましたが今ひとつ根本的な解決手段じゃないなあと本日行った作業を思い出してみるとそういばプラグインいくつか更新したな。。と思い出し本日更新したプラグインを一つずつ無効化して確かめてたら。。
プラグイン「WP to Twitter」の更新が原因でした!!
これを無効化したら全て正常に動作したので私の場合は「プラグインの更新で不具合があった」というのが根本原因でした。。
やっぱりプラグイン更新時は動作確認必須だなあと再認識(^_^;)
WP to Twitterのページを見るとバージョン「3.6.0」に更新すると発生します。
サポートフォーラムを見てもまだこの件については何も記載されてないようなのでもう少し対応待つ必要ありそうです。
今回は更新したプラグインで不具合があったのが原因でしたが、調べていると他の原因でも「更新が失敗しました。返答が正しいJSONレスポンスではありません。」のメッセージが表示されることがあるようです。まずは正常に更新出来ていた時期~エラーが発生した時期までに更新したことを思い出して一つずつ原因を潰すのが一番近道かなあと思います。あと定期的なバックアップも大事!