全ては時の中に…

システム開発全般の技術や開発に役立つツール、プログラミングのサンプルを紹介しています。

Oracle

【Oracle】文字列から指定した文字列の文字位置を取得する

SQLを利用して、ある文字列から指定した文字列の文字位置を取得したいことがあります。
Oracleで文字位置を検索する方法について説明します。
文字位置を検索するには、INSTR()関数を利用します。

《構文》
INSTR('検索対象となる文字列', '検索する文字列')
INSTR('検索対象となる文字列', '検索する文字列', 検索開始位置, n番目)

以下、サンプル。
続きを読む

【Oracle】FOR UPDATE句の使用について

以前の記事「【Oracle】SQLでデータをロックする」でFOR UPDATE句について説明しました。
FOR UPDATEに関する補足情報です。

以下を含むSQLステートメントには、FOR UPDATE句は利用できません。
 1.外部結合(OUTER JOIN)
  →LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN
 2.GROUP BY句
 3.グループ関数
 4.DISTINCT
 5.CONNECT BY句
 6.UNION, INTERSECT, MINUS等の集合演算

上記の内、1つでも該当するものがある場合、以下のエラーが表示されます。
 「ORA-02014 DISTINCT、GROUP BY などを含むビューに対してFOR UPDATE 句を使用できません」
続きを読む

【拡張SQL】グループ毎に連番を割り当てる

以前の記事「【拡張SQL】行番号を割り当てる(其の弐)」の応用です。
ROW_NUMBER()を利用した場合、整列後のデータに対して連番を割り当てるだけでなく、グループ毎に連番を割り当てることができます。
この方法について説明します。

以前の記事では、ORDER BYのみを指定することで、整列後のデータに対して連番を割り当てるようにしました。
今回は、PARTITION BYを併用します。

【ROW_NUMBER()の構文】
  ROW_NUMBER() OVER(PARTITION BY グループ化する項目 ORDER BY 整列する項目)


以下、サンプル。
続きを読む

【Oracle】SQLで端数処理を行う

OracleでSQLを使って端数処理を行う方法について説明します。
Oracleには、端数処理用の関数として、以下の関数が用意されています。
 1.ROUND
 2.TRUNC

1.ROUND関数
 指定した桁数の1つ下の桁で四捨五入します。
 《構文》
  ・ROUND(値)
  ・ROUND(値, 小数桁)
2.TRUNC関数
 指定した桁数の1つ下の桁で切り捨てします。
 《構文》
  ・TRUNC(値)
  ・TRUNC(値, 小数桁)

 どちらも桁数を指定しない場合には、小数第1位以下で端数処理します。 (値としては整数が返ります)

以下、サンプル。
続きを読む

【Oracle】西暦和暦変換

OracleのSQLで西暦と和暦の変換を行う方法について説明します。
和暦を扱う場合、TO_CHAR()やTO_DATE()の第3引数に利用するカレンダーを指定します。
その上で書式に和暦を表す"ee"や"e"を指定します。
※カレンダーを指定していないと、「ORA-01822:年代書式コードがこのカレンダでは無効です。」という書式エラーが発生します。

以下、サンプルです。
続きを読む

【Oracle】SQLのIN演算子に指定できる引数の限界について

OracleでSQLのSELECTステートメントのWHERE句でINを指定する場合、引数の個数に限界があります。
Oracleでは、IN演算子の引数に1,000個を超える引数を指定した場合、エラーが発生します。
IN演算子の引数に副問い合わせを利用することで、このエラーを回避することができます。

以下、サンプル。
続きを読む

【拡張SQL】取得した行番号をWHERE句の条件に指定する

取得した行番号を使って、指定した件数のデータのみを抽出する等の処理を行いたい場合があります。このような処理の実装方法について説明します。

行番号を利用するため、以前の記事「【拡張SQL】行番号を割り当てる(其の弐)」を応用することになります。
取得した行番号をWHERE句に指定することで、取得する件数を絞り込むことになります。

以下、サンプルです。
続きを読む

【拡張SQL】行番号を割り当てる(其の弐)

以前の記事「【拡張SQL】取得したデータに行番号を割り当てる」で取得したデータに行番号を割り当てる方法について説明しました。
この記事の補足です。

Oracleの場合、以下の方法が利用できます。
 1.ROWNUMを利用する。
 2.ROW_NUMBER() OVER (ORDER BY 項目1, 項目2 ...)を利用する。

どちらも取得したデータに行番号を割り当てるのですが、割り当てるタイミングが異なります。

「1.ROWNUMを利用する」の場合、ORDER BY句で整列する前のデータに対して行番号を割り当てます。
そのため、ORDER BY句で整列された状態のデータに行番号を割り当てたい場合には利用できません。

「2.ROW_NUMBER() OVER (ORDER BY 項目1, 項目2 ...)」の場合、OVERの後で指定した順に整列したデータに対し、行番号を割り当てます。
この記述は、SQL Serverの場合と同じです。
(以前の記事「【拡張SQL】取得したデータに行番号を割り当てる」をご覧下さい)

以下、上記の証明です。
続きを読む

【Oracle】セッションを切断する(ロックを解除する)

Oracleに接続している最中にPCがフリーズした等の理由により、データをロックしたまま、セッションが残ってしまうことがある。
データをロックした状態でセッションが残ってしまった場合は、ロックが解除されるまで、該当データに対する編集ができなくなってしまう。そのため、強制的にセッションを切断することで、ロックを解除することが多々ある。
その方法について説明する。

セッションを切断するには、Enterprise Managerから操作する必要がある。
続きを読む

【Oracle】SELECTステートメントの注意点

OracleでSELECTステートメントの選択リストに全項目取得を意味する"*"を指定する場合の注意点について、説明する。
以下、"*"を指定したSELECTステートメントのサンプル。

【前提条件】
 テーブル:Employee
 項目:ID, Name
続きを読む

【拡張SQL】取得したデータに行番号を割り当てる

OracleやSQL ServerでSELECTステートメントを実行して取得した結果に対し、行番号を振りたいことがある。
この方法について説明する。

【前提条件】
 テーブル:Employee
 項目:ID, Name

【データ】
ID, Name
-------------
1, Name001
2, Name002
3, Name003
4, Name004
5, Name005
続きを読む

【Oracle】トリガの作成

テーブルのデータ更新(登録、変更、削除)時に別のテーブルのデータを同時に変更したい場合がある。
この実装方法については、いくつかの手段がある。
 1.プログラム言語で実装する。
 2.ストアドプロシージャで実装する。
 3.トリガで実装する。
  (トリガは、大抵のDBMS製品であれば、利用することができる。)

1と2の方法では、トランザクションを明示化する必要がある。
(BEGIN TRANSACTION, COMMIT, ROLLBACK等を利用する)

今回は、3.トリガで実装する方法について説明する。
※トリガとは、データの変更等のイベントを引き金として、実行するモジュールを指す。
続きを読む

【Oracle】レコードの存在チェック

SQLで指定した条件のレコードが存在するかどうかを確認する場合に利用される方法として、以下のようなものがある。

SELECT COUNT(*) FROM DUMMY

この方法は、データ量に比例して処理時間が長くなる。
大量のデータを扱っている場合には、この処理時間をできる限り短くしたいことも多い。そのような場合には、以下の方法を利用すれば良い。
続きを読む

【Oracle】無償版のOracle(Oracle 10g Express Edition)を入手する

Microsoftが提供しているSQL Server 2005 Express Edition同様、Oracleも無償版のデータベースを提供している。
それが、Oracle 10g Express Edition(以下、Oracle 10g XE)である。
無償版は、一部の機能に制限はある(メモリ容量の変更ができない等)が、利用用途に制限はない。
そのため、商用利用も可能である。また、商用版との互換性も備えているため、規模に応じて商用版にアップグレードすることもできる。
続きを読む

【Oracle】SQLでデータをロックする

Oracleでロックを掛ける場合には、以下の構文を利用する。

【構文】
 ・単体のテーブルのみを扱っているSQLステートメントの場合
  FOR UPDATE [NOWAIT]

 ・複数のテーブルを扱っているSQLステートメントの場合
  FOR UPDATE OF テーブル名.項目名 [NOWAIT]

上記の構文をSELECT, UPDATE, INSERT, DELTE等のステートメントの最後に記述すると、
対象の処理を行った場合にロックがかかる。
続きを読む
Recent Comments
Recent TrackBacks
Profile

ふりっつ

システムエンジニア
取得資格:
 ソフトウェア開発技術者
 MCP(70-290)
メールマガジン:
 【出張版】全ては時の中に…

メールマガジン
メルマガ登録・解除
【出張版】全ては時の中に…
 
 powered by メルマガスタンドmelma! トップページへ
ブログランキング
アクセス解析出会い




にほんブログ村 IT技術ブログへ

にほんブログ村 IT技術ブログ プログラム・プログラマへ

Amazon
スポンサー
HonyaClub.com

PCDEPOT WEB本店/OZZIO

FUJIFILMMALL(フジフイルムモール)

IT 関連資格ならクラムメディア問題集

  • ライブドアブログ