「Oracle」タグアーカイブ

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

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

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


BULK COLLECTとは?

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

基本構文

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

使用例

DECLARE
  TYPE t_emp IS TABLE OF employees%ROWTYPE;
  l_emp t_emp;
BEGIN
  SELECT * 
  BULK COLLECT INTO l_emp
  FROM employees
  WHERE department_id = 10;

  DBMS_OUTPUT.PUT_LINE('取得件数: ' || l_emp.COUNT);
END;

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


FORALLとは?

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

基本構文

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

使用例

DECLARE
  TYPE t_empno IS TABLE OF employees.employee_id%TYPE;
  l_empno t_empno;
BEGIN
  -- 部署ID 20の社員IDをまとめて取得
  SELECT employee_id
  BULK COLLECT INTO l_empno
  FROM employees
  WHERE department_id = 20;

  -- 一括で給与を10%アップ
  FORALL i IN l_empno.FIRST .. l_empno.LAST
    UPDATE employees
    SET salary = salary * 1.1
    WHERE employee_id = l_empno(i);

  COMMIT;
END;
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:DECODE関数とCASE式の違いを徹底解説

Oracle SQLを学んでいると、「DECODE関数」と「CASE式」の使い分けで迷う方は多いのではないでしょうか。
どちらも条件分岐を行うために利用できますが、機能や表現力には明確な違いがあります。

本記事では、DECODEとCASEの特徴、違い、実務での使い分けポイントをわかりやすく解説します。


1. DECODE関数とは?

DECODEOracle独自の関数 で、簡易的な条件分岐を行うために利用されます。
基本構文は次の通りです。

 
DECODE(式, 検索値1, 置換値1, 検索値2, 置換値2, ..., デフォルト値)
  • 指定した式の値と「検索値」が一致すれば、その「置換値」を返す

  • 一致しなければ最後のデフォルト値を返す(省略可能)

例:部署IDに応じて部署名を返す

SELECT DECODE(dept_id, 10, '営業部', 20, '人事部', 30, '開発部', 'その他') AS dept_name FROM employees;

2. CASE式とは?

CASESQL標準 でサポートされる条件分岐の構文です。
Oracleだけでなく、他のデータベース(MySQL、PostgreSQLなど)でも使えます。

構文(シンプルCASE)

 
CASEWHEN1 THEN 結果1 WHEN2 THEN 結果2 ... ELSE 結果N END

構文(検索CASE)

 
CASE WHEN 条件式1 THEN 結果1 WHEN 条件式2 THEN 結果2 ... ELSE 結果N END

例:部署IDに応じて部署名を返す

SELECT CASE dept_id WHEN 10 THEN '営業部' WHEN 20 THEN '人事部' WHEN 30 THEN '開発部' ELSE 'その他' END AS dept_name FROM employees;

3. DECODEとCASEの比較

項目DECODECASE
標準SQLOracle独自機能SQL標準でサポート
構文関数形式式形式
条件「等しい場合」のみ判定可能!ERROR! C4 -> Formula Error: Unexpected ,
可読性ネストが増えると読みにくい複雑な条件もわかりやすく記述可能
移植性Oracleに依存他DBでも利用可能
推奨度古いコードに多い現在はこちらが主流
 

4. 実務での使い分けポイント

  • 既存システムのSQLでDECODEが多用されている → 互換性を保つためそのまま使用するケースあり

  • 新規開発や複雑な条件分岐 → 可読性・移植性を考えて CASE式を推奨

  • DB移行を見据える場合 → CASE式を選択しておくと移植がスムーズ


まとめ

  • DECODE関数:Oracle独自。簡単な条件分岐向け。古いSQLでよく見かける。

  • CASE式:SQL標準。複雑な条件も書けて、移植性・可読性に優れる。

👉 今後の開発では CASE式を優先的に利用 するのがおすすめです。

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

はじめに

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

ORA-00959: tablespace 'USERS' does not exist

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


エラーの原因

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

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

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

このとき、環境に 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(クエリー)例
    SELECT COALESCE(START_DATE, END_DATE, sysdate) FROM CLIENT_ADDRESS;

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

  • 実行結果

Oracle:NVL関数とNVL2関数の違い

oracleの独自関数としてNVL関数やNVL2関数があります。

知ってると結構便利な関数なので、この2つの関数の違いについて整理しておきます。

NVL関数とは

NVL関数は第1引数がNULLなら第2引数の値(代替値)を返します。

もし第1引数の結果がNULLでなければ、そのまま第1引数の値を返します。

注意点として第1引数と第2引数へは同じデータ型を指定する必要があります。

NVL関数の使用例

  • サンプルテーブル「CLIENT_ADDRESS」
  • SQL(クエリー)例
    以下の例ではEND_DATEがNULLでない場合はEND_DATEの値を、NULLの場合はsysdateを返却します。
    SELECT NVL(END_DATE, sysdate) FROM CLIENT_ADDRESS;
  • 実行結果

NVL2関数とは

NVL2関数は第1引数がNULLの場合に、第2引数の値を返却し、第1引数がNULLの場合は第3引数の値を返却します。

注意点として第1引数、第2引数、第3引数に指定する値は全て同じデータ型を指定する必要があります。

NVL2関数の使用例

  • サンプルテーブル「CLIENT_ADDRESS」
  • SQL(クエリー)例
    以下の例ではEND_DATEがNULLでない場合は第2引数のSTART_DATEの値を返却し、END_DATEがNULLの場合は第3引数のsysdateを返却します。
    SELECT NVL2(END_DATE, START_DATE, sysdate) FROM CLIENT_ADDRESS;
  • 実行結果

補足:実務での利用上の注意と代替案のご提案

Oracle の NVLNVL2 関数は便利な反面、以下のような点に留意して使うとより安全・効率的です。

  1. データ型制約に注意する
    NVL/NVL2 では、引数に与える値が「同じデータ型」でなければなりません(Oracle の仕様)という制約があります。
    たとえば、日付型と文字列型を混在させて使おうとすると、意図しない型変換やエラーを招く可能性があります。

  2. NULL の扱いが複雑な場合には COALESCE の利用も検討する
    複数の候補値を順番に評価して最初に NULL でないものを返すような処理をしたい場合は、NVL/NVL2 よりも COALESCE のほうが可読性・拡張性の面で優れるケースがあります。
    たとえば、複数の列を順番にチェックして最初の非 NULL 値を採りたいときなどには COALESCE のほうが直感的に記述できます。

  3. パフォーマンス面の配慮
    NULL チェック・代替値の置き換えという処理自体は軽い操作ですが、複雑な SQL や大規模データセットで組み合わされると、意図せぬオーバーヘッドになることがあります。
    特にインデックス条件や結合条件の中で使う場合は、実行プランを確認して予期せぬフルスキャンなどになっていないか注意しましょう。

  4. 意図の可視化
    関数を多用するクエリは読みづらくなりがちです。
    「なぜこの列で NULL チェックをするのか」「代替値にはなぜこの値を選んだか」といった背景を、コメントやドキュメントとして残しておくと、後から見直すときに助けになります。

Oracle:事前構成済の表領域

Oracle データベースを新規に作成すると、何も設定していなくても
いくつかの 「事前構成済の表領域」 が自動的に作られます。

これらは Oracle 本体の管理情報や、一時的な処理用領域、
一般ユーザーが使うためのデフォルト領域など、
データベース運用の土台になる重要な領域 です。

この記事では、Oracle が作成時に自動で用意してくれる主な表領域と、
それぞれがどのような役割を持っているのかを整理して解説します。


表領域とは何か?

まず前提として、表領域(tablespace) のイメージを簡単におさらいしておきます。

  • データベース内の 論理的な「入れ物」

  • 実体は 1 つ以上の データファイル(*.dbf など)

  • テーブルやインデックスなどのセグメントは、どこかの表領域に属して保存される

つまり、表領域は

「どの種類のデータを、どの物理ファイル群に格納するか」

を切り分けるための単位、と考えると分かりやすいです。


事前構成済の表領域

Oracle データベースを作成すると、デフォルトで次のような表領域が自動作成されます。

 

表領域説明
SYSTEMOracleサーバーがデータベースを管理するために使用する表領域
SYSAUXSYSTEM表領域の補助表領域
TEMPデータベースのデフォルトの一時表領域
UNDOTBS1UNDO表領域
USERS永続表領域
SYSやSYSTEMユーザー以外のユーザー用のデフォルト表領域
EXAMPLEデータベース作成時に「サンプル・スキーマの作成」を指定すると作成される表領域
 


各表領域の役割をもう少し詳しく

上の表だけだと、ニュアンスがつかみにくい部分もあるので、
代表的な表領域について、もう少し踏み込んで解説します。

SYSTEM 表領域

  • Oracle データベースの 中枢となる管理情報 が格納される領域

  • データディクショナリ(オブジェクト定義情報など)が含まれる

  • 原則として、アプリケーションのユーザーデータを入れるべきではない

SYSTEM をいっぱいにしてしまうと、
データベース全体がまともに動作しなくなる 危険があるため、
運用設計時点で「SYSTEM には触らない」というルールを決めておくことが多いです。


SYSAUX 表領域

  • SYSTEM 表領域の 補助表領域

  • さまざまなコンポーネント(Enterprise Manager など)の管理情報が格納される

  • Oracle 10g 以降で導入された、比較的新しい位置づけの表領域

SYSAUX は SYSTEM の負荷分散のために存在しているので、
こちらもアプリケーション用のオブジェクトを作成する場所ではありません。


TEMP 表領域

  • ORDER BY、GROUP BY、ソート、ハッシュ結合などの際に使われる
    一時的な作業領域

  • メモリに収まらなかったデータの「一時退避先」になる

TEMP が足りないと、次のような影響が出ます。

  • 大量データを扱う SQL の性能劣化

  • 場合によってはエラー(ORA-01652 など)で処理失敗

大量データ処理を行うシステムでは、
TEMP のサイズと使用状況を定期的に監視する運用 がほぼ必須です。


UNDOTBS1(UNDO 表領域)

  • 更新系処理の ロールバック情報(UNDO) を保存する表領域

  • トランザクションの取り消しや、一貫性のある参照(CONSISTENT READ)で利用される

UNDO が足りなくなると、

  • ロングトランザクションで古い UNDO が上書きされてしまう

  • 一貫性の保証ができなくなり、エラーが発生する

といった問題に繋がります。

特にバッチ処理など、長時間走る大量更新 があるシステムでは、
UNDO 表領域のサイズ設計が重要です。


USERS 表領域

  • 一般ユーザーがオブジェクトを作成するための デフォルト表領域

  • SYS / SYSTEM 以外のユーザーに割り当てられることが多い

小規模環境や検証用データベースでは、
「とりあえず USERS に全部作る」という運用もよくありますが、
本番環境では業務ごとに表領域を分割したり、
表とインデックスで表領域を分けるなどの設計を行う場合もあります。


EXAMPLE 表領域

  • データベース作成時に「サンプル・スキーマを作成する」を選んだ場合のみ作成される

  • サンプルスキーマ(HR, OE など)のオブジェクトが格納される

学習・検証用途には便利ですが、
本番環境では不要なことが多く、
作成しない or 不要であれば削除する といった扱いにするケースが一般的です。


実運用で意識しておきたいポイント

事前構成済の表領域は、
「最初からあるからそのまま使う」だけだと、
後から運用で困ることもあります。

実務では、特に次の点を意識しておくとトラブルを避けやすくなります。

1. SYSTEM/SYSAUX にユーザーデータを入れない

  • 管理系の表領域に業務テーブルを作らない

  • 開発時点で デフォルト表領域を USERS などに変更 しておく

2. TEMP と UNDO のサイズを定期的に確認する

  • 大量データを扱うバッチ処理の前後で使用量をチェック

  • 苦しくなってきたら、表領域の追加・拡張 を検討

3. USERS を「なんでも置き場」にしない

  • システムが大きくなる前に、業務単位で表領域を分ける設計を検討

  • バックアップ/リストア単位としても表領域分割は有効


まとめ

Oracle データベースを作成すると、
SYSTEM / SYSAUX / TEMP / UNDOTBS1 / USERS / EXAMPLE などの
事前構成済の表領域 が自動的に作成されます。

これらはそれぞれ、

  • データベース管理情報の領域

  • 各種コンポーネントの補助領域

  • ソートや一時処理用の領域

  • ロールバック情報(UNDO)用の領域

  • 一般ユーザー用のデフォルト領域

  • サンプルスキーマ用の領域

といった役割を持っており、
闇雲に使ってよい領域と、そうでない領域がはっきり分かれている のがポイントです。

開発や運用の現場では、

  • SYSTEM / SYSAUX にアプリのテーブルを作らない

  • TEMP / UNDO の使用状況を監視する

  • USERS を一時しのぎではなく、きちんと設計する

といった点を意識しておくと、
後からの障害対応やパフォーマンス劣化に悩まされにくくなります。

Oracle:データベースの起動段階と状態について

Oracleデータベースを起動すると内部的に以下の段階でデータベースが使用可能な状態となります。

データベースの起動段階と状態

 

段階ステータス状態
1SHUTDOWNデータベースが停止している状態
2NOMOUNTインスタンスが起動している状態
※制御ファイル、データファイル、REDOログファイルはクローズ
3MOUNTインスタンスが起動し、制御ファイルがオープンしている状態
※データファイル、REDOログファイルはクローズ
4OPENインスタンスが起動し、制御ファイル、データファイル、REDOログ・ファイルもオープンしている状態
※一般ユーザーが使用可能な状態
 

SQL:指定した日付(該当月)の月末日を取得する方法

SQLで指定した日付項目(該当年月)の月末日を取得するには「LAST_DAY」関数を使用します。うるう年でも正確な月の最終日を取得出来ます。

DBMS毎の使用可否

  • SQL Serverでは「EOMONTH」関数で最終日付を取得出来ます。
    関数\DBMSMySQLPostgreSQLSQL ServerOracle
    LAST_DAY
    EOMONTH

日付(該当月)の最終日を取得する例

サンプルテーブル「BIRTHDAY」

SQL(クエリー)

  • BIRTHDAYテーブルの項目「BIRTHDAY」の最終日を取得する例となります。
    SELECT LAST_DAY(b.BIRTHDAY) 
    FROM BIRTHDAY b 

実行結果