「Oracle」カテゴリーアーカイブ

Oracle「ORA-00054: リソースがビジー状態です」発生時の回避策

Oracleで以下のようなエラーが出ることがあります:

ORA-00054: リソースがビジー状態です。NOWAITを指定したためまたはタイムアウトが発生しました。

これは「対象のオブジェクトが別のセッションでロックされており、現在アクセスできない」ことを意味します。
主に DDL(CREATE、ALTER、DROPなど)を実行した際 に発生します。


🧠 主な発生原因

原因説明
セッションロック他のセッションがテーブルやインデックスを更新中でロック中
長時間トランザクションCOMMITされていないセッションが存在
DDLとDMLの競合DML実行中にALTER TABLEなどDDLを実行しようとした
自動統計・バックアップ中バックグラウンド処理が対象オブジェクトをロックしている

🧩 ロック状況の確認方法

1️⃣ ロックされているオブジェクトを特定


2️⃣ SQLを確認

🧰 回避策①:ロック解除(セッション切断)

他セッションが原因の場合は、該当セッションを強制終了します。


sidserial# は上記クエリで確認可能。

管理者権限(SYSDBA)が必要です。


🧰 回避策②:NOWAIT句またはWAIT句を利用

NOWAIT句(即時判定)


ロック中なら即エラーを返します。スクリプト制御時などに便利です。

WAIT句(待機)


最大10秒まで待機して、解除されれば処理を続行します。

🧰 回避策③:時間をおいて再実行

統計収集や自動ジョブが走っている時間帯(例:夜間バッチ中)に発生しやすいため、
時間をおいて再実行 するのも有効です。
特に自動メンテナンスが有効な環境では、深夜帯に競合することが多いです。


🧰 回避策④:DDLを業務外時間に実行

DDLはオブジェクトを完全ロックするため、
業務時間内にALTERやDROPを実行すると高確率で発生します。

定期メンテナンス時間帯 にスケジュール化しましょう。


⚠️ 注意点

  • KILL SESSION は強制終了のため、他処理への影響リスク がある

  • バッチ処理や自動統計のタイミングと重なると再発する

  • ロック発生元を特定し、原因セッションの対処を優先 することが重要


✅ まとめ(表)

対策内容注意点
セッション確認v$locked_object でロック特定管理者権限が必要
強制切断ALTER SYSTEM KILL SESSION他処理への影響注意
WAIT句利用ロック解除を待つタイムアウト指定が重要
実行タイミング調整バッチや統計処理の時間帯を避ける定期メンテナンス枠を活用

Oracle「ORA-28001: パスワードの有効期限が切れています」対応手順

Oracle Database を利用していると、ログイン時に
「ORA-28001: パスワードの有効期限が切れています」
というエラーに遭遇することがあります。

これは、データベースのセキュリティ機能として「パスワード有効期限」が設定されており、期限を過ぎたユーザがログインできなくなるために発生します。

この場合のエラーの原因と具体的な対応手順を解説します。


エラーの原因

Oracle データベースでは、ユーザごとに割り当てられた プロファイル(Profile) により、パスワード有効期限が管理されています。

典型的な原因は以下の通りです。

  • デフォルトの DEFAULT プロファイルで PASSWORD_LIFE_TIME が 180日 などに設定されている

  • 長期間パスワードを変更しておらず、期限切れとなった

  • 運用上、期限管理を無効化していなかった


対応手順

1. SQL*Plus などからログインを試みる

期限切れの場合、通常のユーザではログインできません。
DBA 権限を持つユーザ(例: sys as sysdba)でログインする必要があります。


2. パスワードをリセットする

対象ユーザのパスワードを変更します。


例:

これでユーザは再びログインできるようになります。


3. パスワード有効期限を確認する

どのプロファイルが割り当てられているかを確認します。

次に、そのプロファイルの設定を確認します。



4. パスワード期限を延長・無効化する(必要に応じて)

運用上パスワード期限を無期限にしたい場合は、以下のように設定します。


特定のユーザ専用プロファイルを作成し、そのみに適用する運用もおすすめです。

注意点

  • セキュリティポリシー上、期限を無期限にするのは推奨されない場合があります。

  • 運用規定に従い、定期的に強度の高いパスワードへ更新しましょう。

  • 本番環境では、DBA以外のアカウントで誤って変更しないよう注意が必要です。


まとめ

「ORA-28001: パスワードの有効期限が切れています」は、パスワードの期限切れによるエラーです。

  • DBA権限でログイン

  • パスワード変更

  • プロファイル確認と調整

この流れで対応すれば、迅速に復旧できます。運用に合わせてパスワード有効期限の設定を見直すことも重要です。

Oracle DBでORA-12170「接続タイムアウト」が出る場合の調査方法

Oracleデータベースに接続しようとした際に、ORA-12170: TNS: 接続タイムアウトが発生しました というエラーが出ることがあります。
このエラーは、クライアントからデータベースへの接続要求がタイムアウトした場合に発生します。ネットワーク障害や設定不備、ファイアウォールの影響など原因は多岐にわたります。この記事では、調査のポイントをステップごとに解説します。


1. エラーメッセージの確認

まずは実際のエラーメッセージを確認しましょう。例えば以下のように出力されます。

ORA-12170: TNS: 接続タイムアウトが発生しました

sqlplus やアプリケーションログに記録されることが多いので、詳細をログからもチェックしておきます。


2. ネットワークレベルの確認

接続タイムアウトの多くはネットワーク経路に起因します。以下を確認しましょう。

  • ping でホストに疎通できるか

  • tnsping でOracleリスナーの応答があるか

  • ファイアウォールやセキュリティグループで 1521/TCP(デフォルトポート)がブロックされていないか

  • VPNやプロキシ経由の場合、経路に問題がないか


3. Oracle Listenerの確認

データベース側でリスナーが正常に動作しているか確認します。

lsnrctl status
  • 状態が READY になっているか

  • 正しいホスト名・ポートで待ち受けているか

  • リスナーログにエラーが出ていないか


4. SQL*Net / TNS設定の確認

クライアント側の tnsnames.ora や接続文字列の設定を見直します。

  • HOST名/IPアドレス が正しいか

  • SERVICE_NAME / SID が一致しているか

  • 環境変数 ORACLE_HOMETNS_ADMIN の設定が適切か

また、サーバ側の sqlnet.ora にて SQLNET.INBOUND_CONNECT_TIMEOUTSQLNET.OUTBOUND_CONNECT_TIMEOUT が過剰に短く設定されていないかも確認します。


5. ファイアウォール / OS設定の確認

サーバOS側の設定も見直す必要があります。

  • OSファイアウォール(iptables / firewalld / Windows Defender Firewall)がポート1521を許可しているか

  • クラウド環境の場合、セキュリティグループやネットワークACL が接続をブロックしていないか

  • 複数NICやロードバランサーを経由している場合に経路の設定が正しいか


6. タイムアウト値の調整

原因が不明な場合、タイムアウト値の調整も検討できます。

  • クライアント側: sqlnet.oraSQLNET.OUTBOUND_CONNECT_TIMEOUT

  • サーバ側: sqlnet.oraSQLNET.INBOUND_CONNECT_TIMEOUT

  • Listener側: listener.oraINBOUND_CONNECT_TIMEOUT_LISTENER

ただし、根本原因がネットワークや設定不備である場合は、単なる延命策になってしまう点に注意が必要です。


まとめ

ORA-12170 が発生した場合の調査手順は以下の流れで進めると効率的です。

  1. ネットワーク疎通確認(ping / tnsping)

  2. リスナー稼働状況確認(lsnrctl status)

  3. 接続設定(tnsnames.ora / 接続文字列)の確認

  4. サーバ側ファイアウォールやクラウドセキュリティ設定の確認

  5. タイムアウト設定の調整

多くの場合、ネットワーク経路やファイアウォールが原因となるケースが多いため、まずは通信経路の確認から着手するのがポイントです。

Oracle「ORA-06502: PL/SQL 数値または値エラー」エラーが出た時の解決方法

Oracle データベースを利用していると、**「ORA-06502: PL/SQL: 数値または値エラー」**というエラーに遭遇することがあります。これは比較的よく見られるエラーの一つで、主に「データ型の不一致」や「文字列長の超過」が原因です。この記事では、このエラーの代表的な原因と解決方法を解説します。


ORA-06502 エラーの意味

エラーメッセージ全文は以下のようになります。

 
ORA-06502: PL/SQL: 数値または値エラー

このエラーは、PL/SQL 実行時に「値が期待されるデータ型に収まらない」場合に発生します。例えば以下のケースです。

  • 数値型の変数に、文字列を代入しようとした場合

  • VARCHAR2 の長さ制限を超える文字列を代入した場合

  • 型変換関数(TO_NUMBER, TO_DATE など)が失敗した場合


よくある原因と解決方法

1. 文字列長の超過

原因: 変数 VARCHAR2(5) に 6文字を代入している。

解決方法: 変数の長さを見直す、あるいは SUBSTR を利用して長さを調整する。


2. 数値変換エラー

原因: 数値に変換できない文字列を渡している。

解決方法: 入力値が数値かどうかを事前にチェックする。正規表現を利用するのも有効です。

 
IF REGEXP_LIKE('123', '^[0-9]+$') THEN v_num := TO_NUMBER('123'); END IF;

3. 不正な日付変換

原因: 存在しない日付を変換しようとした。
解決方法: 入力フォーマットをチェックし、妥当な値のみ渡す。


4. 数値桁数のオーバーフロー

原因: 定義した精度・スケールを超える値を代入している。

解決方法: NUMBER の定義を見直す、または値を丸める。


トラブルシューティングのポイント

  • エラー発生時の 変数定義 を確認する

  • DBMS_OUTPUT.PUT_LINE代入しようとしている値 を出力する

  • データベースの カラム定義と変数定義の不一致 を確認する

  • 外部入力(CSV など)を扱う場合は 入力データの妥当性チェック を行う


まとめ

「ORA-06502」エラーは、ほとんどの場合 データ型の不一致値の範囲超過 が原因です。
再発防止のためには以下が重要です。

  • 変数やカラムの定義を余裕を持たせて設計する

  • 入力値チェックを徹底する

  • デバッグ時に DBMS_OUTPUT を活用して値を追跡する

これらを意識することで、エラーを効率的に解消できるはずです。

Oracle「ORA-01017:ユーザー名/パスワードが無効です。ログオンは拒否されました。ユーザー名を入力してください。」が出た場合の原因と対応方法

Oracle Databaseを利用していると、多くの人が一度は遭遇するエラーが 「ORA-01017: invalid username/password; logon denied」 です。
SQL*PlusやSQL Developerでのログイン、あるいはアプリケーションの起動時に表示され、作業がストップしてしまう厄介なエラーです。

本記事では、このエラーの 原因と解決方法を体系的に整理 し、実際の現場で役立つ対応手順を紹介します。


ORA-01017エラーとは?

このエラーは、Oracleが「入力されたユーザー名またはパスワードが正しくないため、ログオンを拒否した」と判断した際に表示されます。

主に以下のようなシーンで発生します。

  • SQL*Plus で手動ログインするとき

  • SQL Developer などのGUIツールから接続するとき

  • Java/JDBCやPHP などのアプリケーションがDB接続を試みるとき

  • バッチ処理シェルスクリプト による自動接続

単純にパスワードを打ち間違えただけでも発生しますが、実際の現場ではもっと複雑な原因が潜んでいることもあります。


ORA-01017が発生する主な原因

1. ユーザー名やパスワードの誤り

  • スペルミス(大文字・小文字の違いも区別される)

  • コピペ時の不可視文字(空白や改行が含まれている)

  • ユーザー作成時に "USERNAME" のように ダブルクォーテーション付き で作成しており、大文字小文字が厳密に一致していない

2. アカウントがロックされている/パスワード期限切れ

Oracleではセキュリティのため、一定回数の失敗でアカウントがロックされたり、パスワードに有効期限が設定されている場合があります。

3. 認証方式の違い

  • Oracle 12c以降では、古い認証方式(DESなど)が無効化されている

  • 古いクライアント/JDBCドライバで接続すると認証エラーになる

4. 接続先の設定ミス

  • tnsnames.ora の設定が間違っている

  • service_nameSID が異なる環境を参照している

  • テスト環境と本番環境を取り違えている

5. 外部認証の影響

  • OS認証(/ as sysdba)を利用しているが権限が不足している

  • パスワードファイル(orapwd)が正しく作成されていない


ORA-01017エラーの解決方法

1. ユーザー名・パスワードを正確に確認する

まずは基本中の基本。

  • コピー&ペーストではなく手入力 で試す

  • 大文字小文字を区別することを意識する

  • ユーザー作成時に "USERNAME" のように指定していないか確認

2. アカウントの状態を確認する

管理者ユーザーで以下を実行します。

  • LOCKEDALTER USER ユーザー名 ACCOUNT UNLOCK;

  • EXPIREDALTER USER ユーザー名 IDENTIFIED BY 新パスワード;

3. 認証方式を見直す

ユーザーごとのパスワードバージョンを確認:

  • 10G のみ → 古い方式。新しいクライアントで接続不可の可能性あり

  • 11G12C が含まれているか確認

  • JDBCドライバやOCIクライアントを 最新化 する

4. 接続文字列を確認する

誤接続が多いポイントです。

  • hostnameservice_name が正しいか

  • ローカルの tnsnames.ora が古い情報を持っていないか

5. 外部認証を確認する

  • OSユーザーに必要な権限があるか

  • SYSDBA接続が可能な状態か

  • パスワードファイルが壊れていれば orapwd コマンドで再作成


現場でのチェックリスト

  1. 入力の大文字・小文字を再確認する

  2. コピペではなく手入力で試す

  3. DBA_USERS を確認してアカウント状態を把握

  4. クライアントやJDBCドライバを最新化

  5. 接続先(サービス名/ホスト名)が正しいか見直す

  6. OS認証やパスワードファイルに問題がないか確認


まとめ

「ORA-01017」は、単純に「パスワード間違い」と片付けがちですが、実際には アカウントロック、認証方式、接続先設定の誤り など複数の要因が絡むことがあります。

対処の基本ステップは以下の通りです。

  • 入力の確認 → アカウント状態の確認 → 認証方式・接続設定の見直し

これを押さえておけば、大半のケースで迅速に問題を解決できます。

PL/SQL:BULK COLLECTとFORALLを使った効率的な大量データ処理

Oracle PL/SQLを使って大量データを処理する際、1行ずつループして処理を行うとパフォーマンスが低下します。
このようなケースで活躍するのが BULK COLLECTFORALL です。

これらを活用することで、SQLとPL/SQL間のコンテキスト切り替えを最小限に抑え、大量データを効率的に処理できます。


BULK COLLECTとは?

BULK COLLECTは、複数行のデータを一括でコレクション(配列型変数)に格納する仕組みです。

基本構文

 
SELECT カラム名 BULK COLLECT INTO コレクション変数 FROM テーブル名 WHERE 条件;

使用例

✅ 通常のSELECT INTOでは1行しか取得できませんが、BULK COLLECTを使うと複数行をまとめて変数に格納できます。


FORALLとは?

FORALLは、コレクションに格納されたデータを使って一括処理(INSERT/UPDATE/DELETE)を行う構文です。

基本構文

 
FORALL インデックス IN コレクション.FIRST .. コレクション.LAST DML文;

使用例

FORループで1件ずつUPDATEするよりも大幅に高速化できます。

BULK COLLECTとFORALLを組み合わせる

実務では、BULK COLLECTで一括取得 → FORALLで一括更新/削除といった流れがよく使われます。

処理フロー例

  1. BULK COLLECTで対象データを配列に取得

  2. 配列の内容をFORALLで一括更新

  3. コミット

このように組み合わせることで、バッチ処理や大量データ更新におけるパフォーマンスを劇的に改善できます。


パフォーマンス比較

  • 従来のループ処理
    SQLとPL/SQL間で行き来が多くなり、数万件以上の処理では遅くなる

  • BULK COLLECT + FORALL
    コンテキストスイッチが最小化され、処理速度が数倍〜数十倍向上するケースもある


注意点

  • BULK COLLECTで一度に大量データを取得するとメモリ不足の可能性あり
    LIMIT句を組み合わせて分割取得が推奨

  • FORALLはDML専用(SELECTでは使えない)

  • 例外処理はSAVE EXCEPTIONSを付けて制御することも可能


まとめ

  • BULK COLLECT → 複数行を一括取得

  • FORALL → 複数行を一括処理

  • 大量データ処理では必須テクニック

  • メモリ管理や例外処理に注意しつつ使うと、バッチ処理の効率が大幅に改善


💡 実際のプロジェクトでは「数十万件以上のデータ更新」で特に効果が出やすいため、PL/SQLチューニングの定番として覚えておきましょう。

Oracle:ORA-12514エラーの原因と対処法をわかりやすく解説!

Oracleデータベースに接続しようとしたときに表示される

「ORA-12514: TNS:listener does not currently know of service requested in connect descriptor」 エラー。
初めて遭遇すると「何が原因なの?」と戸惑いますよね。

この記事では、ORA-12514エラーの意味・主な原因・確認ポイント・具体的な対処方法を、初心者にもわかりやすく解説します。


◆ ORA-12514エラーとは?

エラーメッセージ全文:

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

これは簡単に言うと、クライアント側が接続しようとしているサービス名を、リスナーが認識できていないという意味です。


◆ 主な原因とチェックポイント

原因説明チェックポイント
サービス名の誤記接続文字列で指定しているサービス名が存在しない、またはタイプミスtnsnames.oraのSERVICE_NAMEやDB側のサービス名(lsnrctl status)を確認
リスナーがサービスを登録していないリスナーが起動していても、対象のインスタンスが登録されていないDB起動状態の確認、lsnrctl statusで登録サービスを確認
接続先がSID指定になっている接続方式がSID指定なのにサービス名でアクセスしている、またはその逆接続方法をSID or SERVICE_NAMEに合わせて見直す
データベース未起動DBが起動していないため、サービスがリスナーに登録されないsqlplus / as sysdba → startup でDB起動を確認
リスナーの設定ミスlistener.ora に不要な制限や間違いがあるlistener.oraを見直し、設定ミスがないかチェック

◆ 対処法:よくあるパターン別解決手順

✅ パターン1:サービス名の誤り

エラーメッセージ例:

ORA-12514: TNS:listener does not currently know of service requested

対処方法:

  1. lsnrctl status で現在リスナーが認識しているサービス名を確認

  2. tnsnames.ora や JDBC URL に記載されている SERVICE_NAME と一致しているか確認

  3. 必要に応じて修正して再接続


✅ パターン2:データベースが起動していない

確認方法:

sqlplus / as sysdba
 
startup;

→ DBが停止していた場合は、このコマンドで起動することで解消します。


✅ パターン3:接続方式がSID指定になっている

tnsnames.ora の記述例(良くない例)

 
SERVICE_NAME = ORCL

→ SID指定をしたいなら以下のように記述

 
SID = ORCL

または、JDBC URL では :SID/SERVICE_NAME の違いに注意。

 
// SID指定 jdbc:oracle:thin:@host:1521:ORCL // SERVICE_NAME指定 jdbc:oracle:thin:@//host:1521/ORCL

◆ 補足:lsnrctlでのサービス確認方法

 
lsnrctl status

実行結果の中に Service "XXX" has 1 instance(s) の記述があれば、リスナーはそのサービスを認識しています。


◆ まとめ

  • ORA-12514は「リスナーがサービスを認識していない」ことが原因

  • 原因は設定ミス・サービス名の誤り・DB未起動など多岐にわたる

  • まずは lsnrctl statustnsnames.ora の内容を照らし合わせよう


◆ よくある質問(FAQ)

Q1. サービス名はどこで確認できますか?
A. lsnrctl status で確認可能です。あるいはDB起動後に SELECT value FROM v$parameter WHERE name='service_names'; でも取得できます。

Q2. SIDとSERVICE_NAMEは何が違う?
A. SIDは「インスタンス名」、SERVICE_NAMEは「サービス識別子」。Oracle 9i以降はSERVICE_NAME推奨です。

Oracle:SYSDBA権限とSYSOPER権限の違いと使い分け

はじめに

Oracleデータベースの運用において、管理者権限の使い分けは非常に重要です。特に「SYSDBA」と「SYSOPER」はどちらも特別な権限として知られていますが、役割や利用シーンは異なります。本記事では、それぞれの権限の違いと、実務での適切な使い分けについて解説します。


SYSDBA権限とは

SYSDBAは、Oracleデータベースにおける最上位の管理権限です。
SYSDBAで接続すると、ユーザーは自動的にSYSスキーマとして認識され、あらゆる管理操作が可能になります。

主な操作内容

  • データベースの起動・停止(STARTUP / SHUTDOWN)

  • データベースの作成(CREATE DATABASE)

  • 完全なリカバリやバックアップ操作

  • ユーザー作成や権限付与など、すべての管理作業

  • データファイルや制御ファイルの操作

特徴:Oracle全体のフルコントロールが可能であるため、通常はDBA(データベース管理者)専用で使用されます。


SYSOPER権限とは

SYSOPERは、SYSDBAほどの強力な権限は持ちませんが、運用担当者が日常的に行う基本的な管理作業を実行できます。

主な操作内容

  • データベースの起動・停止(STARTUP / SHUTDOWN)

  • インスタンスのバックアップ・リカバリ(ただし制限あり)

  • ログファイルの管理(アーカイブログ切り替えなど)

  • データベースの作成やユーザー管理は不可

特徴
SYSOPERでは、データの中身に直接触れることはできません。あくまで運用作業の補助権限に近い立ち位置です。


SYSDBAとSYSOPERの違い(比較表)

項目SYSDBASYSOPER
データベースの起動・停止
データベース作成不可
ユーザー/権限管理不可
完全リカバリ一部可(制限あり)
アーカイブログ切り替え
データファイル/制御ファイル操作不可
データの参照・変更不可
想定される利用者DBA(管理者)運用担当者

使い分けのポイント

  • SYSDBA

    • データベースの構築、スキーマ管理、リカバリなどフル機能が必要なとき

    • DBA専用アカウントとして限定的に使用することが推奨される

  • SYSOPER

    • 運用担当者が日常業務(起動・停止、バックアップ実行など)を行うとき

    • セキュリティを強化しつつ運用を分担する際に有効


まとめ

Oracleの管理権限であるSYSDBAとSYSOPERは、似ているようで明確な役割分担があります。

  • SYSDBA = フル権限、構築・管理・リカバリの責任者用

  • SYSOPER = 制限付き権限、日常運用担当者用

セキュリティと役割分担を意識して適切に使い分けることが、安定したデータベース運用につながります。

Oracleユーザー作成時にORA-00959エラー発生!指定された表領域が存在しない場合の対処法

はじめに

Oracle Databaseでユーザーを作成する際に、以下のようなエラーが発生することがあります。

ORA-00959: tablespace 'USERS' does not exist

このエラーは、指定した表領域(tablespace)が存在しない場合に発生します。本記事では、原因の解説と実際の解決方法をまとめます。


エラーの原因

ORA-00959「指定した表領域が存在しない」 ことを意味します。

例えば以下のSQLを実行した場合を考えます。

このとき、環境に USERS という表領域が作成されていなければ、ORA-00959 が返されます。

よくある原因

  • インストール時にデフォルトの USERS 表領域が作成されなかった

  • 他の管理者が不要と判断し削除してしまった

  • マルチテナント環境(CDB/PDB)で表領域の有無が異なる


対処法

1. 既存の表領域を確認する

まずは現在存在している表領域を確認します。

 
SELECT tablespace_name FROM dba_tablespaces;

ここで USERS が表示されなければ、エラーの通り存在していないことが確認できます。


2. 表領域を作成する

存在しない場合は新たに表領域を作成します。

 
CREATE TABLESPACE USERS DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

※ データファイルのパスは環境に応じて修正してください。


3. 既存の表領域を指定してユーザーを作成する

新しく表領域を作成せず、既存の表領域を利用する方法もあります。

 
CREATE USER testuser IDENTIFIED BY password DEFAULT TABLESPACE SYSTEM TEMPORARY TABLESPACE TEMP;

ただし、SYSTEM を業務用に利用するのは推奨されないため、専用の表領域を作成する方がベストです。


4. ユーザー作成後の権限付与

ユーザー作成が成功したら、最低限以下の権限を付与します。

 
GRANT CREATE SESSION TO testuser; GRANT CREATE TABLE TO testuser;

必要に応じて他の権限も付与してください。


まとめ

  • ORA-00959「指定した表領域が存在しない」 ことが原因

  • DBA_TABLESPACES ビューで表領域の存在を確認

  • 必要に応じて新規作成、または既存の表領域を指定する

表領域の存在を確認してからユーザー作成を行うことで、エラーを回避できます。

❓よくある質問(FAQ)

Q1. ORA-00959エラーはなぜ発生するのですか?

A. 指定した表領域(tablespace)が存在しない場合に発生します。ユーザー作成時の DEFAULT TABLESPACE に指定した名前が、データベース内に存在しないことが原因です。


Q2. 表領域が存在するかどうかを確認するには?

A. 以下のSQLで確認できます。

 
SELECT tablespace_name FROM dba_tablespaces;

ここに指定した名前が含まれていなければ、新しく表領域を作成する必要があります。


Q3. SYSTEM表領域を代わりに使っても良いですか?

A. 技術的には可能ですが推奨されません。SYSTEM はOracle内部で利用される表領域であり、業務用のオブジェクトを置くとパフォーマンスや管理に悪影響が出る可能性があります。専用の表領域を作成しましょう。


Q4. 表領域を作成するときのファイルパスはどう決めればいいですか?

A. 通常はOracleデータベースのデータファイル格納ディレクトリ(例:/u01/app/oracle/oradata/ORCL/)に置きます。環境ごとの構成ポリシーに従い、十分な容量のあるディスクを指定してください。


Q5. マルチテナント環境(CDB/PDB)でも同じ対応ですか?

A. はい。ただしCDB直下とPDB配下で表領域の有無が異なることがあります。ユーザーを作成するPDBに接続し直し、そのPDB内で表領域を確認・作成してください。

Oracle:COALESCE関数の使い方

oracleの独自関数のCOALESCE(コアレス)関数の用途についてメモしておきます。

COALESCE関数とは

COALESCE関数は引数のリストから最初のNULL以外の値を返却するOracle独自関数となります。

NVL2関数との違いは必ずしも引数へ指定するデータ型を全て合わせる必要はないことです。

ただデータの一貫性を保ちたい場合は極力データ型は合わせた方が望ましいです。

サンプルテーブル

  • サンプルテーブル「CLIENT_ADDRESS」

COALESCE関数の使用例

  • SQL(クエリー)例

    上記例ではSTART_DATEがNULLであればEND_DATEの値を、END_DATEもNULLであればsysdateを返却します。

  • 実行結果