Oracle 基本概念を整理

2008. 3. 26. 14:06



①設置手順書
 Oracle Database 10g Express Edition for Microsoft Windowsの場合
 
http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html
 ユーザーネーム   userID@mail.com
 パスワード    ******
 ダウンロードしてインストール
 
 
②オラクルに関するユーザー権限は?
 ・SQL文を実行する権利
 ・他のユーザーに属するオブジェクトにアクセスする権利
 ・PL/SQLパッケージを実行する権利
 
 参考URL
 
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19269-01/admusers.html#609073
 http://oracle.na7.info/4_1_user.html
 
 
③Transactionとは?
 DBMSには一連の処理内容を記録してデータの統合性を保つ機能があり、
 その記録された処理内容をTransactionといい、SQLで管理できる。
 処理を開始してから、COMMIT,ROLLBACKするまでをいう。
 
 
 
④テーブルの操作について調査してください
 create table テーブル作成
 create view  ビュー作成
 alter table  テーブル定義一部変更
 insert   データ追加
 update   データ修正
 delete   データ削除
 commit   トランザクションコミット
 rollback  トランザクションキャンセル
 select   データ検索
 drop view  ビュー削除
 drop table  テーブル削除
 truncate  テーブル削除(rollback不可)


⑤Sequenceとは?
 順序番号のことでテーブルへデータを登録するごとに番号を振りたい時などに使用する。
 create sequence シーケンス名 で作成できるが、システム権限が必要。
 


⑥Indexとは?
 データの検索速度を向上させるために、
 どの行がどこにあるかを示した索引のこと。。
 create index インデックス名 で作成できるが、システム権限が必要。

by artis

Oracle9i Database Release 2 プラットフォーム共通 ドキュメント

2008. 3. 24. 10:51

by artis

PL/SQLプログラムの基礎

2008. 3. 12. 16:12


PL/SQLプログラムの基礎 
 
わたしは昔勉強しただけであり、このページは勉強のまとめとして作成しました。
よって、実務的なご質問には応じられませんし、もう忘れました。ご了承ください。
------------------------------------------------------------------------
モジュールの基礎 

1.モジュールとは
モジュールには2種類あります。
1つはプロシージャ(PROCEDURE)、俗に言う、サブルーチンの事です。
もう一つはファンクション(FUNCTION)、俗に言う、関数の事です。
サブルーチンは、ある特定の作業を行います。
ファンクションは、ある特定の作業を行った後に、一つの回答を出します。
例えば、「食べる」という処理があるとします。これがサブルーチンなら、食べるとい
う作業を行うだけですが、これがファンクションなら、食べるという作業に対し、その評
価として「うまかった」もしくは「まずかった」などを回答します。

2.モジュールタイプ
モジュールには2つのタイプがあります。
1つはPROCEDURE(プロシージャ)、もう1つはFUNCTION(ファンクション)です。

3.モジュール名称
モジュールは固有の名称を持ちます。
ユーザプログラマがモジュールを扱う場合、このモジュール名称を使います。

4.パラメータリスト(引数)
モジュールは、ゼロ以上複数のパラメータ(引数)を受け取り、基本的に同じ作業を、
毎回微妙に違う感じで行います。
例えば、「なめる」と言うモジュールがあったとします。
モジュール「なめる」に対し、パラメータ「5番」を渡して実行させると、
5番をなめます。
モジュール「なめる」に対し、パラメータ「3番」「7回」を渡して実行させると、
3番を7回もなめます。

5.リターン値(戻り値、返り値)
関数(ファンクション)は、それ自体が1つの値を持ちます。
例えば、関数「なめる」がなめた感想を返す、とします。その関数に対し、パラメータ
「4番」を渡して実行させると、関数「なめる」は「うまかった」もしくは「まずかった」
「好みじゃない」などの戻り値を返します。
------------------------------------------------------------------------
------------------------------------------------------------------------
データ型の基礎 
データ型は、文字や数字を扱う場合に、その種類を明示しておくもので、
主に文字列型と数値型や、特殊なアンカー属性、
ユーザプログラマが作成するユーザ型などがあります。

1.一般的な型
1)VARCHAR2
文字型です。文字列を扱います。最大文字列数は4000文字ぐらいです。
VARCHARのヴァージョンアップ版だから2といいます。
兄弟として、CHAR、VARCHAR、LONGなどがあります。

2)NUMBER
数値型です。数値を扱います。
整数、実数、正の数、負の数、何でもありです。
兄弟として、FLOATなどがあります。

3)BINARY_INTEGER
正の整数のみ扱います。
BINARYは2進数、INTEGERは整数の意味です。

4)BOOLEAN
TRUEまたはFALSEの値を持ちます。TRUEを真、FALSEを偽という事もあります。
TRUEの値は-1(フルビットオン)、FALSEは0(フルビットオフ)です。

5)テーブル型
データベースのテーブルの型です。
テーブル名称%ROWTYPEとして使用します。
 
2.アンカー属性
アンカー属性は、TYPEとROWTYPEの2種類があり、他のデータを参照してそのデータ型
をコピーするという、特殊な方です。どちらも頭に%をつけて使用します。
これを用いれば、「あのテーブルのこの項目を受け取る型」と言う形で
宣言する事ができます。
TYPEは、普通の変数名に用います。
ROWTYPEは、テーブル自体をさすなど、ちょっと変わった使い方をします。
変数名称%TYPEとか、テーブル名称%ROWTYPEと言う形で使います。
 
3.ユーザ定義型
ユーザプログラマが勝手に作る事のできる型の事です。
SUBTYPE ユーザ定義型名称 IS 型名称 [ := 初期値 ]; と記述します。
ユーザ定義型名称には、型の特徴をあらわす名称を自由に付けます。
型名称には、VARCHAR2などの既存の型のほか、TYPE等のアンカー属性を用いて、
特定の型に合わせる事もできます。
また、書式は違いますがユーザプログラマが任意に作製できるレコードの型があります。
 RECODE ( 項目名 型名 [, 項目名 型名・・・ ] )
レコード型は、任意のレコードの形を作成するものです。
主に、カーソルのリターン値やその受け取り、それらの宣言などに使われます。

------------------------------------------------------------------------
------------------------------------------------------------------------
モジュール定義の基礎 
1.モジュールの構造
モジュールは大きく分けて(1)ヘッダー、(2)宣言部、(3)本体部、(4)例外部
で構成されています。
まずモジュールの識別名称があり、次にモジュールが動作する環境を整え、
そしてモジュールが実際に動作する内容が来て、
最後には、もしエラーが起きた場合の例外処理を、
あらかじめ決めておく、という流れで構成されます。

1)モジュールヘッダー
1/モジュールタイプ
PROCEDUREかFUNCTIONかのどちらかを指定します。
2/モジュール名称
ユーザプログラマが任意に指定します。
名称は他のモジュールと重ならず、機能を表すわかり易い名前をつけます。
3/パラメータリスト(引数)
モジュールが受け取るパラメータの、名称とタイプと型と初期値を、
パラメータの数の分だけ指定します。
名称と型は必須で、タイプ型と初期値は省略できます。
タイプとは、そのパラメータが入力用か出力用か、
その両方かを示し、省略すると入力用として認識されます。
初期値は、タイプが入力用か入出力用のときのみ指定できます。
これを省略すると、初期化はされません。
4/リターン値(返り値、戻り値)
モジュールタイプがFUNCTION(関数)のとき、関数が返す返り値の型を指定します。
ファンクションは、返り値の型を省略できません。

2)モジュールの宣言部
モジュール内で使用する、変数や定数、ユーザ定義型、
カーソルやローカルモジュールを宣言します。
これらは、このモジュール独自のもので、外から参照する事はできません。

3)モジュールの本体部
モジュールの動作を記述します。
仕様で宣言しておいた変数やカーソルを用い、目的の作業をします。

4)モジュールの例外部
モジュールの本体にてエラーが発生した場合、自動的にこのプログラムへ制御が移ります。
エラー時の例外処理を記述しておきます。

2.モジュールの仕様
( FUNCTION | PROCEDURE )
 関数名称(
  [ 引数名称 [ IN | OUT | IN OUT ] 型 [ ( := | DEFAULT ) 初期値 ]
  [, 引数名称・・・] ] ) RETURN 型
IS
 関数内で使用する変数やカーソル等の宣言
BEGIN
 関数内部
 RETURN 戻り値
EXCEPTION
 例外(エラー時)の処理
 RETURN 戻り値
END;

3.FUNCTIONとPROCEDUREの違いについて
関数(ファンクション)は、戻り値をもつと言う点だけプロシージャと異なっています。
よって次の2点が、関数(ファンクション)にあってプロシージャにはありません。
1)ヘッダーの最後のRETURN値の型宣言

2)BEGIN区とEXCEPTION区のRETURN文

4.引数について
1)引数のタイプ
引数には3つのタイプがあります。
1/入力用 IN
ユーザプログラマからデータが渡されてきます。
この引数には初期値が指定でき、ユーザプログラマがデータを渡さなかったとき
(省略したとき)、この初期値が採用されます。また、この引数は定数です。
モジュール内にてこの引数の値を参照する事はできますが、
別の値を代入する事はできません。
2/出力用 OUT
ユーザプログラマから、回答を格納する変数が渡されてきます。
ユーザプログラマは、この引数を省略できません。
この引数に、初期値を指定する事はできません。
この引数は特殊な定数です。参照できません。
値の代入はできますが、代入した値は、すぐには反映されません。
それが反映されるのは、モジュールが正常に終了し、
制御がユーザプログラマに移ったときです。
モジュールが例外処理で終了した場合は、
事前に代入を行っていても、その値は反映されません。
この引数に代入できるデータ型は、変数のみです。
定数やリテラル値、式の代入はできません。
3/入出力用 IN OUT
ユーザプログラマから、回答を格納する変数が渡されてきます。
ユーザプログラマは、この引数を省略できません。
この引数には、初期値を指定する事ができます。
その場合、ユーザプログラマが指定した回答を格納する
変数にあらかじめ設定されていた値は、初期値によって更新されます。
この引数は、参照可能であり、代入可能であり、代入はすぐに反映されます。
つまりモジュール内にて、普通の変数と同じように扱う事ができます。

2)仮パラメータと実パラメータについて
ユーザの立場からしてみて、ユーザが指定するパラメータを「実パラメータ」、
モジュール内部で扱われるパラメータを「仮パラメータ」といいます。

3)引数の位置の指定について
関数やプロシージャを呼び出す際にカッコの中に指定する変数や値の事を
パラメータといいますが、その並び方について、PL/SQLでは2種類の方法があります。
1/位置指定法
通常、他の言語でも、関数に対する引数の順番は完全に決まっており、
ユーザプログラマがこの位置を変える事はまかりなりません。
この時、「左から何番目は何の引数」という事が位置的にきっちりと決まっており、
このようにパラメータが引き渡される事を「位置指定法」といいます。
例えばモジュール「飲みに行く(誰と、どこへ)」というものがあったとします。
この時、「飲みに行く(かおりちゃん、浅草)」とモジュールを実行した場合、
「浅草へかおりちゃんと飲みに行く」と正しく解釈されますが、その順番を変え、
「飲みに行く(銀座、部長)」とモジュールを実行してしまった場合、
その解釈は「部長へ銀座と飲みに行く」となってしまい、おかしくなります。
「位置指定法」は、パラメータの順番を変えてはいけません。
コンパイルエラーになればまだ運が良く、後でバグとして発覚した場合は大変です。
2/名前指定法
通常、他の言語でも、関数に対する引数の順番は完全に決まっており、
ユーザプログラマがこの位置を変える事はまかりなりません。
ですが、PL/SQLでは、これをユーザプログラマが自由に指定できます。
それを「名前指定法」といいます。
例えば「破壊する(何を、どのように)」というモジュールがあったとします。
この時、「破壊する(無茶苦茶、ハードディスク)」とモジュールを実行した場合、
その解釈は「無茶苦茶をハードディスクに破壊する」というものになり、
訳が分かません。
これを、「破壊する(どのように => 無茶苦茶、何を => ハードディスク)」と
実行すると、「何を=ハードディスクを、どのように=無茶苦茶に、破壊する」と
正しく解釈されます。
このように、「名前指定法」を用いれば、ちょっとソースが長くなりますが、
引数がモジュールにどのように解釈されるかが、
ソースを見ただけで分かるようになります。
また、引数がたくさんあるモジュールなどは、
よくその引数ごとにコメントをほどこして分かり易くしてあるものを見かけますが、
「名前指定法」を用いれば、その「分かりづらさ」から解決する事となります。
代入演算子は「=>」です。左辺が仮パラメータで、右辺が実パラメータとなります。

5.宣言部にて宣言するもの
モジュールの宣言部には、モジュールの中で扱う変数などのさまざまな部品を宣言して
おきます。
宣言できるものとしては、変数、定数、カーソル、モジュールなどがあります。

1)変数と定数の宣言について
変数名 [ CONSTANT ] 型名 [ := 初期値 ];
モジュールの宣言部で宣言された変数や定数は、モジュールの本体部にて使用できます。
変数名は、ユーザプログラマが自由につけます。
CONSTANTを指定すると、「定数」の定義になります。
型名は、VARCHAR2などの既存の型のほか、テーブル名.項目名%TYPEや、
テーブル%ROWTYPEなどのアンカー属性を後いて指定する事もできます。
初期つをつけるかどうかはユーザプログラマの自由です。
ただし、定数の場合は省略不可です。
定数としてあらかじめ決められた値の事をマジック値といいます。
それに対し、プログラム上に直接記述される値の事をリテラル値といいます。
プログラムの常識として、リテラル値の仕様は極力避け、
定数(マジック値)として宣言しておきます。

2)カーソルの宣言について
宣言
CURSOR カーソル名(
 [引数名称 [ ( IN | OUT | IN OUT ) ] 型、引数名称・・・]
 ) [ RETURN 型名 ]
IS
 
 SQL文
開く
OPEN カーソル名([引数名称、引数名称・・・]);
取得
FETCH カーソル名 [ INTO 返り値受け取り変数 ];
閉じる
CLOSE カーソル名
カーソルとは、SQL文をあらかじめ定義しておくものです。
主に、本体部のソースをすっきりさせるために使用します。
OPENしたとき、宣言されていたSQLが実行され、その回答群がメモリ上に作成されます。
ユーザプログラマはその回答を、FETCH(取ってくる、の意)で取得します。
オープン時には引数を指定する事ができます。
カーソルの定義時にその引数をどのように使うかあらかじめ宣言しておき、
汎用的なカーソルを作成する事ができます。
回答群の数だけFETCHを実行する事ができ、
そのすべての回答をメモリ上から回収し終わったとき、
CLOSEを実行してカーソルの処理を終了します。
回答群の終了は、カーソル名%FOUND が偽(FALSE = IF文の判定に引っかからない)
となるときです。
OPENしていないカーソルをCLOSEしてはいけません。
パッケージ仕様にカーソルを宣言する時、カーソルの仕様を示さねばならないため、
リターン値が必要です。モジュールや使用時に気にする必要はありません。

3)ローカルモジュールの宣言について
モジュールの中にモジュールを作る事ができます。
この時の下位のモジュールのことをローカルモジュールといいます。
モジュールの宣言部に宣言する以外、普通にモジュールを宣言するのと変わりません。
モジュールの中からしか参照できないという点以外、宣言および使用法は
普通のモジュールと変わりありません。

4)モジュールのオーバーロードについて
モジュールは、いくつか同じ名称を持つものを作成する事ができます。
同じモジュール名称で動作がそれぞれ違うという事ですが、
その使用目的は、例えば、「あいさつ(誰に)」「あいさつ(何回)」
「あいさつ(どんな)」というモジュールがあったとします。
この時、「あいさつ(部長)、あいさつ(1)、あいさつ(丁寧)」という感じで
実行した場合、「部長にあいさつをする、1回あいさつをする、丁寧にあいさつをする」
と解釈されます。
外見上は同じ「あいさつ」というモジュールが、パラメータを見て違う動作をして
いるように見えますが、実際にその振分を行っているのはコンパイラであり、
プログラマは、ご苦労にも3種類の、
それぞれパラメータの異なる「あいさつ」というモジュールを作成しているのです。
このように、同じ名称のモジュールが複数あって、それぞれ動作が違っているもの
を「モジュールのオーバーロード」といいます。

1/パラメータのデータ型グループの相違
コンパイラは、これらの同じ名称を持つモジュールを、パラメータで区別します。
よって、オーバーロードされているモジュールのパラメータは、少なくともその
1つの型が違っていなくてはいけません。
VARCHARとVARCHAR2という違いはだめです。
パラメータに文字列が指定された場合、
その文字列がCHAR型なのかVARCHAR型なのかVARCHAR2型なのか、LONG型なのか、
コンパイラが判断しかねるからです。
同等の事が、数値を指定した場合にもいえます。
「オーバーロードされているモジュールの間で、
最低1つのパラメータのデータ型グループが異なっていなければいけません。」
ちなみに、INやOUTのタイプの違いは、データ型の識別には考慮されません。
したがってそれが違うからといって、パラメータの相違とはなりません。
また、RETURNの型が違うというのも却下です。
あくまでパラメータの型がぜんぜん違うというのが前提です。

2/有効範囲が同じである事
たとえ、オーバーロードのパラメータのルールに完全にのっとっていても、
それが有効範囲の異なる場所で宣言されていてはいけません。
例えば、ネストの中にローカルモジュールを宣言しておき、
さらにその下の階層のネストにて同じ名称のモジュールを宣言しようとすると、
コンパイラエラーが発生します。
なぜならば、オーバーロードされるモジュールは同じ階層にあるものという制限があり、
当然階層の違うモジュールの間では、オーバーロードは実現しません。
にも関わらず同じ名称のモジュールを宣言したために、
「オーバーロード関数でもないのに同じモジュール名称が使われた」といって、
コンパイラが怒るのです。

5)ネストについて
モジュールの本体部には、さらに独立した本体部を作成する事ができます。
更にその本体部の中に、更なる本体部を作成する事ができます。
このように、プログラムの中であたかも階層が降りているようなコーディングを
ネストといいます。
PL/SQLにおいて、本体部のネストは、BEGIN~ENDの中にBEGIN~ENDを入れるという
形になります。
PL/SQLでBEGIN~ENDのネストを行う利点として、その中にEXCEPTION(例外処理)
を記述できるという事があります。
「たとえ途中でエラーが起きても次の処理へ移りたい」という場合、
もしもエラーが発生したらその制御は強制的にEXCEPTIONへ、
それがない場合はモジュールが終了してしまいます。
しかしモジュールの中にネストを作り、
そのネストの中にEXCEPTIONを指定してやれば、
エラー時の例外処理がそのネストの内部のみで処理され、
それが終われば次に進むような仕組みを作る事ができます。

------------------------------------------------------------------------
------------------------------------------------------------------------
パッケージの基礎 
パッケージは、モジュールの1ランク上の存在であり、複数の変数や定数、
カーソルやモジュールを含み、それらを管理するものです。
パッケージは、1つのシステムであり、1つのプログラムであり、1つの家です。

1.情報の公開と隠蔽
パッケージが所有するデータには、大きく分けて公開用と秘密用の2種類があります。
複数のデータやファンクションを要し、それぞれに公開用と秘密用があるというものは、
「オブジェクト指向プログラム」と呼ばれるプログラム技法のものであり、
大規模なプログラムアプリケーションの開発で発生する問題に対する解決法です。

1)大規模なアプリケーション開発で発生する問題
不特定多数のプログラマが、同一上にある複数のプログラムまたは同じプログラム
を触るため、データの破壊によるバグが発生します。(良くあります)

2)そこで情報の公開と隠蔽
すべてのデータを公開という形でほうっておくのではなく、適度に隠蔽し、
そのデータに触れる事のできるのは特定のプログラムのみ、ユーザプログラマは、
直接データに触れるのではなくその特定のぷとグラムを通して行うという形を徹底します。
そうする事によって、3日徹夜した挙げ句に「ここ、ここ、ゼロが一個多い」などという
悲惨なバグ修正が、少しは減らす事ができます。

3)めんどくさい
はい、そうです。
手続きというものはそういうものです。
下手に上場しているような会社に行くと、名前と会社名(学校名)と作業場所を
受付に告げ、バッチなどをもらわなければ、不法侵入です。
不法侵入によるデータの破壊を防ぐというのがインターフェースの目的なのです。

2.パッケージの概要
パッケージの構成は、大きく2つに別れます。
1つは、関数などを宣言する「仕様」部分。パッケージ仕様といいます。
もう1つは、仕様で宣言された関数などを実際に記述する「本体」部分です。
パッケージ仕様は、パブリック要素がないなど特に必要のない場合は、省略できます。

3.パッケージの構文
仕様部分に宣言するカーソルや関数、プロシージャは、単なる宣言のみで、
プログラム本体は含みません。
仕様の変数と本体の変数では、同じ名前は使用できません。
本体にあるBEGIN区は、パッケージ自体の実行部であり、
パッケージ自身の初期化として変数の初期化などに使用します。
パッケージ仕様
PACKAGE パッケージ名称
IS
 [ 変数館の宣言 ]
 [ カーソルやモジュールの宣言(仕様の宣言のみ) ]
END [ パッケージ名称 ];
パッケージ本体
PACKAGE BODY パッケージ名称
IS
 [ 変数と型の宣言 ]
 [ カーソルの宣言(本体) ]
 [ BEGIN
  実行文 ]
[ EXCEPTION
  例外ハンドラ ]
END [ パッケージ名称 ];

4.パブリック要素とプライベート要素
パッケージの外から参照できるものをパブリック要素、
パッケージの中の関数等からしか参照できないものをプライベート要素と呼びます。
パブリック要素は公開され、プライベート要素は非公開です。
パッケージにおいて、仕様にて宣言されたものがパブリック要素として外に公開され、
本体にて宣言されたものがプライベート要素として外には公開されません。
ただし、関数やプロシージャは、パブリックだろうがプライベートだろうが、
その実体は共にパッケージの本体にあります。

------------------------------------------------------------------------
------------------------------------------------------------------------
アプリケーションの構成 

1.全体図
 

2.各データの有効範囲
アプリケーションの中で、変数やモジュールなどの有効範囲は、4階層に分かれます。
1)第1階層 パッケージ仕様
ここで宣言されたデータを、「グローバルなパブリックデータ」といいます。
アプリケーション内のすべての階層から参照する事ができます。

2)第2階層 パッケージ本体
パッケージの仕様と本体は1体1の関係ですが、
仕様で宣言した場合と違って本体で宣言した場合は、
「グローバルなプライベートデータ」といいます。
第2階層以下の同じパッケージ本体にあるすべてのプログラムから参照できます。

3)第3階層 モジュール
モジュールの宣言部で宣言されたデータを、「プライベートデータ」といいます。
第3階層以下の同じモジュールに属するすべてのプログラムから参照できます。

4)第4階層以下 無名ブロック(と、そのネスト達)
無名ブロックの宣言部で宣言されたデータは、「ローカルデータ」といいます。
第4階層以下の同じブロックに属するすべてのプログラムから参照できます。

3.データアクセスルーチン
階層や所属の違うデータにアクセスする時は、要注意です。
下の階層へは元々アクセスできないので関係ないですが、上の階層のデータへは、
簡単にできてしまいます。
しかし、そのデータがいつまでも同じ姿でいるという保証はありません。
プログラムはヴァージョンアップするものです。アプリケーションというのは、
常に変更され続ける生物です。
そこで、そのデータが宣言されている同じ所属同じ階層に、
特定のデータを操作する為の専用のファンクション(関数)を用意し、
データへのアクセスはこの受付を通すようにします。
この様なプログラムの事を、プログラムインターフェースといいますが、
特にこの様なファンクションを、「データアクセスルーチン」(受付のお姉さん)
といいます。
たとえデータの仕様が変わろうとも、「お姉さんを修正すればそれで終わり」という
状況を作る事ができます。
 もしも・・・

1)「お姉さん」を作っておらず、さまざまなプログラムが勝手にデータに
直接アクセスしていたとします。

2)データの仕様が変わらざるをえなくなったとします。

3)その修正個所が1000を超えるとします。
(大きなものならば、これぐらいはありえます。)

4)さらに、2万行のプログラムを3つ渡されて、「見といて」と気軽に言われるかも
知れません。

5)「部長、プログラマの○○君が出社してきません・・・」

------------------------------------------------------------------------
------------------------------------------------------------------------

by artis

Oracle Database 10g Express Editionについて

2008. 3. 12. 16:03

Oracle Database 10g Express Editionについて

=========================================================
★☆ Oracle 10g Express Edition
http://blog.naver.com/onh1111?Redirect=Log&logNo=80043747187

=========================================================
★☆ Oracle Database 10g Express Edition:
http://blog.naver.com/joniel?Redirect=Log&logNo=50004853354

=========================================================
★☆ Welcome to the Oracle Database 10g Express Edition Tutorial!
http://st-curriculum.oracle.com/tutorial/DBXETutorial/index.htm

=========================================================
★☆ 「Oracle Database 10g Express Edition」 インストール
http://www.dbonline.jp/oracleinstall/install/index2.html

=========================================================


by artis

Oracleで使うSQLの基礎を学ぶ

2008. 2. 26. 11:32

by artis

패키지의 기초

2008. 1. 7. 17:37


패키지는 모듈의 하나의 랭크상의 존재이고, 복수의 변수나 정수, 커서나 모듈을 포함해, 그것들을 관리하는 것입니다.
패키지는 1개의 시스템이며, 1개의 프로그램이며, 1개의 집입니다.

1. 정보 공개와 은폐
패키지가 소유하는 데이터에는 크게 나누어 공개용과 비밀용의 두 종류가 있습니다.
복수의 데이터나 펑션을 필요로 해, 각각 공개용과 비밀 용무가 있다고 하는 것은, (객체 지향 프로그램)이라고 불리는 프로그램 기법으로, 대규모 프로그램 어플리케이션의 개발로 발생하는 문제에 대한 해결법입니다.

1) 대규모 어플리케이션 개발로 발생하는 문제
불특정 다수의 프로그래머가 같은 프로그램을 손대기 때문에, 데이터 파괴에 의한 버그가 발생합니다.

2. 패키지의 개요
패키지의 구성은 크게 두 가지로 분류합니다.
하나는 함수등을 선언하는 사양부분, 패키지 사양이라고 합니다.
다른 하나는 사양으로 선언된 함수등을 실제로 기술하는 본체 부분입니다.
패키지 사양은 필요가 없는 경우는 생략할 수 있습니다.

3. 패키지의 구문
사양 부분에 선언하는 커서나 함수, 프로시저는 단순한 선언만으로 프로그램 본체는 포함하지 않습니다.
사양의 변수와 본체의 변수에서는 같은 이름은 사용할 수 없습니다.
본체에 있는 BEGIN구는 패키지 자체의 실행부이며, 패키지 자신의 초기화로서 변수의 초기화 등에 사용합니다.

패키지 사양
PACKAGE 패키지 명칭
IS
 [ 변수의 선언 ]
 [ 커서 모듈의 선언(사양의 선언) ]
END [ 패키지의 명칭 ];
패키지 본체
PACKAGE BODY 패키지 명칭
IS
 [ 변수와 형의 선언 ]
 [ 커서의 선언(본체) ]
 [ BEGIN
  실행문]
[ EXCEPTION
  예외 핸들러 ]
END [ 패키지 명칭 ];

4. 퍼블릭 요소와 프라이베토 요소
패키지의 밖으로부터 참조 가능한 것을 퍼블릭 요소, 패키지의 안에 함수 등으로 부터만 참조할 수 없는 것을 프라이베토 요소라고 부릅니다.
퍼블릭 요소는 공개되어 프라이베토 요소는 비공개입니다.
패키지에 대한, 사양에 선언된 것은 퍼블릭 요소로서 외부에 공개되어, 본체에 선언된 것이 프라이베토 요소로서 외부에는 공개되지 않습니다.
단지, 함수나 프로시저는 퍼블릭이나, 프라이베토 겠지만, 그 실체는 모두 패키지의 본체에 있습니다.






by artis

모듈의 기초

2008. 1. 7. 12:01

1. 모듈이란
모듈에는 2가지 종류가 있다.
하나는 프로시져(Procedure), 다르게 말해 서브루틴 입니다.
다른 하나는 펑션(Fuction), 다르게 말해 함수 입니다.
서브루틴은 어떤 특정의 작업을 행합니다.
펑션은 어떤 특정의 작업을 행한 후에 하나의 회답을 냅니다.
예를들어 (먹는다)하는 처리가 있다고 합시다. 이것은 서브루틴이라면, 먹는다는 작업을 하는 것만입니다만, 이것이 펑션이라면 먹는다라는 작업에 대해, 그 평가로 맛있었다, 또는 맛없었다 같은 것을 회답한다.

2. 모듈 타입
모듈은 두가지의 타입이 있다.
하나는 프로시져(Procedure), 다른 하나는 펑션(Fuction)이다.

3. 모듈의 명칭
모듈은 고유의 명칭을 갖고 있다.
유저 프로그래머가 모듈을 다루는 경우, 모듈 명칭을 사용합니다.

4. 파라메타 리스트(인수)
모듈은 제로 이상 복수의 파라메타(인수)를 담당하고, 기본적으로 같은 작업을 매번 비묘하게 다른 느낌을 행합니다.
예를들어 (나메루: 맛보다,체험하다)라는 모듈이 있다고 합시다.
모듈 (나메루: 맛보다,체험하다)에 대해서, 파라메타 5번을 넘겨서 실행시키면, 5번을 (나메루: 맛보다,체험하다)합니다.
모듈 (나메루: 맛보다,체험하다)에 대해서, 파라메타 3번, 7번을 넘겨서 실행시키면 3번을 7회 (나메루: 맛보다,체험하다)합니다.

5. 리턴값(모로리치, 카에리치)
함수(펑션)은 그 자체가 하나의 값을 갖고 있습니다.
예를들어 함수 (나메루)가 나메따 감상을 반환합니다. 그 함수에 대해서, 파라메타 4번을 건내서 실행시키면, 함수 (나메루)는 잘했다 또는 못했다 같은 리턴값을 반환합니다.

데이터형의 기초
데이터형은 문자나 숫자를 다루는 경우에 그 종류를 명시한 것으로, 주로 문자열형과 수치형, 특수한 앵커구성, 유저프로그래머가 작성한 유저형 같은것이 있습니다.

1. 일반적인 형
1) VARCHAR2
문자형입니다. 문자형을 다룹니다. 최대문자열수는 4000문자 정도 입니다.
VARCHAR의 버젼업판 이라서 2라고 합니다.
형제로 CHAR, VARCHAR, LONG이 있습니다.

2) NUMBER
수치형입니다. 수치형을 다룹니다.
정수, 실수, 正の数、負の数 무엇에도 있습니다.
형제로 FLOAT같은 것이 있습니다.

3) BINARY_INTEGER
正の整数のみ를 따릅니다.
BINARY는 2진수, INTEGER는 정수의 의미입니다.

4) BOOLEAN
참 또는 거짓의 값을 갖고 있습니다. TRUE은 참, FALSE는 거짓이라는 것도 있습니다.
TRUE의 값은 -1(불 비트 온), FALSE는 0(불비트 오프)입니다.

5) 테이블형
데이터베이스의 테이블의 형입니다.
테이블 명칭%ROWTYPE로 사용합니다.

2. 앵커 구성
앵커 구성은 TYPE와 ROWTYPE의 2종류가 있고, 다은 데이터를 참조해서 그 테이터형을 카피한  특수한 것입니다. 모두 머리에 %를 붙여서 사용합니다.
이것을 사용하면, {어떤 테이블의 항목을 받는 형}을 말하는 형에 선언하는 것이 가능합니다.
TYPE는 보통의 변수명에 사용합니다.
ROWTYPE는 테이블 자체를 가리키고, 조금 다른 사용법을 갖고 있습니다.
변수명칭%TYPE나, 테이블명칭%ROWTYPE로 하는 형으로 사용합니다.

3. 유저 정의형
유저 프로그래머가 편의대로 만드는 것이 가능한 형입니다.
SUBTYPE 유저정의형명칭 IS 형명칭 [ := 초기값 ]; 으로 기술합니다.
유저 정의형명칭에는 형의 특징을 쓴 명칭을 자유롭게 붙입니다.
형명칭에는 VARCHAR2같은 기존의 형과 다른 TYPE등의 양커 구성을 써서, 특정형으로 합치는 것도 가능합니다.
서식은 다르지만, 유저프로그래머가 임의로 제작가능한 레코드형이 있습니다.
RECODE ( 항목명 형명 [ 항목명 형명 ] )
레코드 형은 임의의 레코드형을 작성하는 것입니다.
주로 커서의 리턴값이나 받음, 선언으로 사용됩니다.

 1) 모듈 헤더
1/ 모듈 타입
PROCEDURE나 FUCTION을 가리킵니다.
2/ 모듈 명칭
유저프로그래머가 임의로 지정합니다.
명칭은 다은 모듈과 중복되고, 기능을 표시하기 쉬운 이름을 붙입니다.
3/ 파라메타 리스트 (인수)
모듈이 받은 파라메타의 명칭과 타입과 형과 초기값을 파라메타 수로 나눈것을 지정합니다.
명칭과 형은 필수로, 파입형과 초기값은 생략할 수 있습니다.
타입은 그 파라메타가 입력용인가 출력용인가를 표시하고, 생략하면 입력용으로 확인됩니다.
초기값은 타입이 입력용인지 입출력용인지를 지정할 수 있습니다.
이것을 생략하면 초기화는 되지 않습니다.
4/ 리턴값
모듈 타입이 FUNCTION(함수)일 때, 함수가 반환하는 리턴값의 형을 지정합니다.
펑션은 리턴값의 형을 생략할 수 없습니다.

2) 모듈의 선언부
모듈내에 사용하는 변수나 정수, 유저 정의형, 커서, 로컬 모듈을 선언합니다.
이것은 모듈 독자적인 것으로 외부에서 참조할 수 없습니다.

3) 모듈의 본체부
모듈의 동작을 기술합니다.
사양에 선언해둔 변수나 커서를 써서, 목적의 작업을 합니다.

4) 모듈의 사양
( FUNCTION | PROCEDURE )
 변수명칭(
  [ 인수명칭 [ IN | OUT | IN OUT ] 형 [ ( := | DEFAULT ) 초기값 ]
  [, 인수명칭・・・] ] ) RETURN 형
IS
 함수 내에 사용하는 변수나 커서 등을 선언
BEGIN
 함수 내용
 RETURN 리턴값
EXCEPTION
 예외(에라 시)의 처리
 RETURN 리턴값
END;


3. FUNCTION과 PROCEDURE의 다른점에 대해서
함수(펑션)은 리턴값을 갖고 있는 점만 프로시져와 다릅니다.
그래서 다음의 두가지 점이 함수(펑션)에는 있고 프로시저에는 없습니다.
1) 레더의 최후의 RETURN값의 형 선언
2) BEGIN구와 EXCEPTION구의 RETURN문

4. 인수에 대해서
1) 인수의 타입
인수에는 세 개의 타입이 있습니다.
1/ 입력용 IN
유저 프로그래머로 부터 데이터가 건내집니다.
이 인수에는 초기값이 지정되어, 유저프로그래머가 데이터를 건내지 않은 때(생략한 때), 이 초기값이 쓰입니다. 이 인수는 정수입니다.
모듈내에 이 인수값을 참조하는 것은 가능합니다만, 다른 값을 대입하는 것은 할 수 없습니다.

2/ 출력용 OUT
유저 프로그래머로부터 회답을 받은 변수를 건내받을 수 있습니다.
유저 프로그래머는 이 인수를 생략할 수 없습니다.
이 인수에 초기값을 지정하는 것은 할 수 없습니다.
이 인수는 특수한 정수입니다. 참조할 수 없습니다.
값의 대입은 할 수 있지만, 대입한 값은 바로는 반영되지 않습니다.
그것이 반영되는 것은 모듈이 정상적으로 종료해, 제어가 유저 프로그래머로 옮겨갔을 때입니다.
모듈이 예외처리에 종료한 경우는 사전에 대입을 하고 있어도, 그 값은 반영되지 않습니다.
이 인수에 대입할 수 있는 데이터형은 변수만 가능합니다.
정수나 리터럴값, 식의 대입은 할 수 없습니다.

3/ 입출력용 IN OUT

유저 프로그래머로부터, 회답을 받은 변수를 건내 받습니다.
유저 프로그래머는 이 인수를 생략할 수 없습니다.
이 인수에는 초기값을 지정하는 것이 가능합니다.
그 경우, 유저 프로그래머는 지정한 회답을 갖은 변수에 미리 설정되어있던 값은 초기치에 의해서 갱신됩니다.
이 인수는 참조 가능하고, 대입 가능하고, 대입은 곧바로 반영됩니다.
즉 모듈내에서, 보통 변수와 같이 취급 할 수가 있습니다.

2) 가상파라메타와 실파라메타에 대해
유저의 입장으로 본 유저가 지정한 파라메타를 실파라메타, 모듈 내부에서 다루어지는 파라메터를 가상파라메타 라고 합니다.

3) 인수 위치의 지정에 대해서
함수나 프로시저를 호출할 때에 괄호안에 지정하는 변수나 값을 파라메타라고 하여, 그 열거법에 대해서 PL/SQL에서는 두 종류의 방법이 있습니다.
1/ 위치지정법
통상, 다른 언어에서도 함수에 대한 인수의 차례는 완전하게 정해져 있어 유저 프로그래머가 이위치를 바꾸는 것은 허용되지 않습니다.
이때, [왼쪽에서 몇번째는 무슨 인수]라는 것은 위치적으로 제대로 정해져 있어 이와같이 파라메터가 인도되는 것을 위치지정법 이라고 합니다.
예를들면 모듈 (마시러 간다 (누구와, 어디에))라는 것이 있다고 합시다.
이 때, (마시러 간다 (누구와, 어디에))라는 모듈을 실행했을 경우, 사오리와 신주쿠에 마시러 간다.라고 올바르게 해석됩니다만, 이 차례를 바꾸어 (마시러 간다 (긴자, 부장))라고 모듈을 실행해 버렸을 경우, 그 해석은 (부장에게 긴자와 마시러 간다)라고 이상하게 해석됩니다.
위치지정법은 파라메터의 차례를 바꿔서는 안됩니다.
컴파일 에러가 되면 그래도 운이 좋은 것이고, 버그로 발견되면 큰 일입니다.
2/ 이름지정법
통상, 다른 언어에도 함수에 대한 인수의 차례는 완전하게 정해져 있어서, 유저 프로그래머가 위치를 바꾸는 것은 허용되지 않습니다.
그렇지만, PL/SQL에는 이것을 유저 프로그래머가 자유롭게 지정할 수 있습니다.
그것을 이름지정법이라고 합니다.
조금 소스가 길어지지만, 인수가 모듈에 어떻게 해석될지가 소스를 본 것만으로 알수 잇게 됩니다.  대입연산자는 = 입니다.
좌변이 가상파라메터로 우변이 실파라메터가 됩니다.

5. 선언부에서 선언하는 것
모듈의 선언부에는 모듈 안에서 취급하는 변수들이 다양한 부품을 선언해 둡니다.
선언할 수 있는 것으로서는 변수, 정수, 커서, 모듈 등이 있습니다.

1) 변수와 정수의 선언에 대해서
변수명 [ CONSTANT ] 형명 [ := 초기값 ];
모듈의 선언부에서 선언된 변수나 정수는 모듈의 본체부에서 사용할 수 있습니다.
변수명은 유저 프로그래머가 자유롭게 붙입니다.
CONSTANT를 지정하면, 정수의 정의가 됩니다.
형명은 VARCHAR2 등의 기종의 형태외, 테이블명.항목명%TYPE나, 테이블%ROWTYPE등의 앵커 속성을 지정하는 것도 가능합니다.
초기값을 붙일지 말지는 유저 프로그래머의 자유입니다만, 정수의 경우는 생략 불가입니다.
정수로서 미리 결정된 값의 일을 매직값 이라고 합니다.
그에 대해, 프로그램상에 직접 기술되는 값을 리터럴값 이라고 합니다.
프로그램의 상식으로 리터럴값의 사양은 정수(매직값)로서 선언합니다.

2) 커서의 선언에 대해서
선언
CURSOR 커서명(
 [ 인수명칭 [ ( IN | OUT | IN OUT ) ] 형、인수명칭・・・]
 ) [ RETURN 형명 ]
IS
 
 SQL문
열기
OPEN 커서명([인수명칭、인수명칭・・・]);

취득
FETCH 커서명 [ INTO 리턴값을 취하는 변수];

닫기
CLOSE 커서명

커서는 SQL문을 미리 정의해 두는 것입니다.
주로, 본체부의 소스를 깨끗이하기 위해 사용합니다.
OPEN 했을 때, 선언되고 있던 SQL가 실행되어 그 회답군이 메모리상에 작성 됩니다.
유저 프로그래머는 그 회답을 FETCH로 취득합니다.
오픈 시에는 인수를 지정할 수가 있습니다.
커서의 정의시에 그 인수를 어떻게 사용할까 미리 선언해 두어, 범용적인 커서를 작성할 수가 있습니다.
회답군의 수만큼 FETCH를 실행할 수가 있어 모든 회답을 메모리상으로부터 다 회수했을 때, CLOSE를 실행해 커서의 처리를 종료합니다.
회답군의 종료는 커서명%FOUND가 거짓(FALSE = IF문의 판정에 걸리지 않았을 때)이 될 때 입니다.
OPEN하고 있지 않는 커서를 CLOSE해서는 안됩니다.
패키지 사양에 커서를 선언할 때, 커서의 사양을 나타내지 않으면 안되기 때문에, 리턴치가 필요합니다. 모듈이나 사용할때에는 신경 쓸 필요는 없습니다.

3) 로컬 모듈의 선언에 대해서
모듈안에 모듈을 만들수 있습니다.
이 때에 하위의 모듈을 로컬 모듈이라고 합니다.
모듈의 선언부에 선언한 것 이외, 통상적으로 모듈을 선언하는 것과 다르지 않습니다.
모듈중에서 밖에서 참조할 수 없다고 하는 점 이외, 선언 및 사용법은 보통의 모듈과 서로 다릅니다.

4) 모듈의 오버로드에 대해
모듈은 몇개의 같은 명칭을 갖는 것을 작성할 수가 있습니다.
같은 명칭의 모듈이 다수 존재하고, 각각의 동작이 차이가 나는 것을 모듈의 오버로드 라고 합니다.
1/ 파라메터의 데이터형 그룹의 상위 컴파일러는 이러한 같은 명칭을 가지는 모듈을 파라메터로 구별합니다. 따라서 오버로드 되고 있는 모듈의 파라메터는 적어도 한개이상의 형태가 차이가 나지 않으면 안됩니다.
VARCHAR와 VARCHAR2의 차이는 해당하지 않습니다.
파라메터에 문자열이 지정되었을 경우, 문자열이 CHAR형인가 VARCHAR형인가 VARCHAR2형인가, LONG형인지 컴파일러가 판단하기 어려운 경우입니다.
이것이 수치를 지정했을 경우에도 해당하지 않습니다.
오버로드되고 있는 모듈 간에 최저 1개의 파라메터의 데이터형 그룹이 차이가 나지 않으면 안됩니다. 덧붙여서 IN이나 OUT의 타입의 차이는 데이터형의 식별에는 고려되지 않습니다.
따라서 타입이 다르다고, 파라미터의 차이점이 되는 것은 아닙니다.
또, RETURN의 형태가 다르다는 것도 마찬가지로 차이점이 되는 것은 아닙니다.
어디까지나 파라메터의 형태가 전혀 다르다는 것이 전제입니다.

2/ 유효 범위가 같은 것
비록 오버로드의 파라메터의 룰에 완전하게 따르고 있어도, 그것이 유효한 범위의 다른 장소에서 선언되어서는 안됩니다.
예를 들어, 네스토 안에 로컬 모듈을 선언해 두어, 한층 더 그 아래 계층의 네스토에 같은 명칭의 모듈을 선언하려고 하면, 컴파일러 에러가 발생합니다.
왜냐하면 오버로드 되는 모듈은 같은 계층에 있어야 하는 제한이 있어서, 계층이 다른 모듈 간에는 오버로드는 되지 않습니다.
그럼에도 같은 명칭의 모듈을 선언했기 때문에, 오버로드 함수도 아닌데 같은 모듈 명칭이 사용되었다라고 컴파일 에러가 발생합니다.

5) 네스트에 대해서
모듈의 본체부에는 독립된 본체부를 작성할 수가 있습니다.
더욱 그 본체부안에, 본체부를 작성할 수가 있습니다.
이와 같이, 프로그램 안에서 계층이 있는 것을 네스트라고 합니다.
PL/SQL의 본체부의 네스트는 BEGIN ~ END안에 BEGIN ~ END를 넣는 형태가 됩니다.
PL/SQL로 BEGIN ~ END의 네스트를 사용하는 이점으로는 안에 EXCEPTION(예외처리)을 기술할 수 있는 점이 있습니다.
(도중에 에러가 나도 다음 처리로 옮기고 싶다)라고 하는 경우, 에러가 발생하면 그 제어는 강제적으로 EXCEPTION에 처리가 없는 경우는 모듈이 종료해 버립니다.
그러나 모듈안에 네스트를 만들어, 그 네스트안에 EXCEPTION을 지정해 주면, 에러시의 예외 처리가 네스트의 내부만으로 처리되고, 처리가 끝나고 진행되는 구조를 만들수가 있습니다.

by artis

PL/SQL 프로그램의 기초

2008. 1. 7. 10:10

PL/SQL이란?
PL/ 은 Procedual Language Extensions 의 약자로, (테가키형의 언어확장)의 의미입니다.
결국, PL/SQL은 SQL이라는 언어를 (테가키형)이라는 프로그램형식으로 대응 할 수있게 확장된 것을 가리킵니다.
SQL자체는 본래데로, 데이터베이스를 다루는 언어로, PL/SQL로도 직접기술하는 것이 가능합니다. 더욱이 PL/SQL에는 다른 언어처럼 함수의 호출이나 변수정수의 사용이 가능합니다.

사용 가능한 변수
데이터베이스에 사용되는 테이터는 주로 3가지가 있다.
1. 문자열형
2. 수치형
3. 날짜형 (-> PL/SQL에는 프로그램 언어로서 범용성 )
4. 변환형 (데이터형을 변환한다)
5. Boolean형
6. BINARY_INTEGER형 (2진수값을 다룬다)
7. 레코더형 (테이터베이스의 레코드를 다룬다)

스토아도 프로시져
스토아도 프로시져(Stored Procedure)는 바로 데이터베이스에 들어있는 프로시져를 가리킵니다. 프로시져는 PL/SQL에 대한 처리가 복수행으로 모아진 것이다.
스토아도 프로시져를 사용하면 처리속도의 향상을 가져옵니다.
PL/SQL내에 있는 스토아도 프로시져를 호출하는 것은 물론, 데이터베이스에 스토아도 프로시져가 등록되어 있다면 그것을 조작하는 것이 당연하게 SQL부터 그것을 호출해 동작되는 것이 가능하다.


by artis