DB/Oracle/PLSQL/変数の利用
目次†
変数を使う基礎基本。
基本的な使い方†
使う変数は必ず宣言が必要。大文字と小文字は区別されない。
- 変数の利用
declare -- 変数宣言。変数名の後に型を宣言する hoge number; fuga varchar2(10); -- 宣言と同時に初期化も可能。:= と default は同じ意味 hoge number := 100; hoge number default 100; fuga varchar2(20) := 'fuga' -- 変数に NOT NULL 制約を付加 hoge number not null := 100; -- 定数にする場合は constant を指定 hoge constant numer := 100; begin ... end; /
変数名の制約†
使う際、大文字と小文字は区別されないので注意。
- 文字で始まること
- 文字または数値、記号($、_、#)からなること
- 30 文字以下であること
- 予約語ではないこと
変数の型†
変数にはいくつか型があるのでその確認。
- PL/SQL 変数
- スカラデータ型
- コンポジットデータ型
- 参照データ型
- LOB データ型
- PL/SQL 以外の変数
- バインド変数
スカラデータ型†
単一の値だけ保存できる変数。いわゆる変数、一般的な意味での変数はこれ。
- スカラデータ型一覧(抜粋)
型 説明 CHAR[(<size>)] 固定長文字データ。最大 32,767 バイト VARCHAR2[(<size>)] 可変長文字データ。最大 32,767 バイト NUMBER[(<precision, scale>)] 数値。オプションは精度と桁数 PLS_INTEGER 整数。NUMBER 型より早い BOOLEAN 真偽値。TRUE か FALSE か NULL DATE 日付 TIMESTAMP 日付。小数秒まで含む TIMESTAMP WITH TIME ZONE 日付。タイムゾーンの時差を含む
文字列リテラル†
VARCHAR2 型で宣言。最大で 32,767 バイト。表の列の型では 4,000 だったので違いに注意。
- 文字列リテラル
declare -- 宣言 hoge varchar2(10); begin -- シングルクォートで代入 hoge := 'hoge hoge'; -- シングルクォートを文字列として扱う場合、二個続けて記述する hoge := 'hoge''s hoge'; -- あるいは q' 表記を使う -- q' の次の文字をデリミタとして扱う。任意の文字で良い -- カッコの場合は閉じカッコを勝手に認識してくれる hoge := q'(hoge's hoge)'; hoge := q'!hoge's hoge!'; hoge := q'Ahoge's hogeA'; ... end; /
ブール変数†
真偽値。値は TRUE、FALSE、NULL のどれか。
- ブール変数
declare -- 宣言 hoge boolean; begin -- 代入 hoge := true; -- 式の結果をそのままも入れられる hoge := ( fuga > piyo ); ... end; /
コンポジットデータ型†
複数の値を保持できる変数。配列みたいなもの。
- 種類
- PL/SQL レコード
- PL/SQL コレクション
- 種類の詳細
種類 型名 呼び方 備考 PL/SQL レコード record レコード変数 よく使う PL/SQL コレクション table 索引付き表 よく使う nested table ネストした表 varray varray
RECORD 型†
テーブルの行(横一列)なイメージ。異なる型のデータを複数保持する場合。
- RECORD 型
declare -- レコードそのものの作成。格納するフィールドとその型を列挙する -- フィールド宣言部はふつうの変数と一緒。not null、:=、%type など使用可 type foo is record ( bar number, baz varchar2(10) ); -- 作成したレコードを変数に割り当てる hoge foo; begin -- < 変数名 >.< フィールド名 > でアクセスできる hoge.bar := 10; hoge.baz := 'Baz'; end; /
データベースとの連携も柔軟。ある表の列定義と同じフィールドを持つ RECORD 型変数を簡単に作るのが %ROWTYPE。
- %ROWTYPE
declare -- foo 表の定義を参考に RECORD 型変数を作る hoge foo%rowtype; -- カーソルを定義していればカーソル名からもレコード変数を定義可能 hoge <cursorname>%rowtype; begin -- SELECT するときにすごく楽。INTO に RECORD を指定するだけ select * into hoge from foo; -- INSERT するときもすごく楽。VALUES に RECORD を指定するだけ insert into foo values hoge; -- UPDATE するときもすごく楽。ROW に RECORD を放り込むだけ update foo set row = hoge where baz = 'Baz'; -- 参照方法は同じ hoge.bar := 10; end; /
TABLE 型†
索引付き表。テーブルの列(縦一列)なイメージ。同じ型のデータを複数保持する場合。
索引というのは、いわゆる配列の添え字みたいなもの。ただし連続している必要はない。めちゃくちゃな順序で入れてもいい(内部的には格納順ではなくて索引順でソートされて管理されるっぽい)。数字をよく使うけど、varchar2 でも良い。そうすると連想配列みたいなものになるね。
データの個数は定義しない。可変長配列みたいなもの。
- TABLE 型
declare -- 索引つき表そのものの作成。格納する列の型を定義する type foo is table of bar.baz%type index by pls_integer; -- 作成した索引付き表を変数に割り当てる hoge foo; begin -- < 変数名 >(< 索引番号 >) でアクセスできる hoge(1) := 10; hoge(2) := 20; -- インデックス番号は任意。連続している必要もない hoge(100) := 30; end; /
メソッドが使える。中途半端にオブジェクト指向……?
- メソッド
declare type foo is table of bar.baz%type index by pls_integer; hoge foo; ... begin -- インデックス番号 1 の要素が存在していれば TRUE if hoge.exist(1) then ... -- 要素数 var := hoge.count; -- 最小の索引番号を返す(何もなければ NULL) var := hoge.first; -- 最大の索引番号を返す(何もなければ NULL) var := hoge.last; -- 一個前の索引番号を返す var := hoge.prior(10); -- 一個次の索引番号を返す var := hoge.next(10); -- 要素を削除する hoge.delete; -- すべて削除 hoge.delete(10); -- インデックス番号 10 の要素を削除 hoge.delete(1, 5); -- インデックス番号 1 から 5 の要素を削除 end; /
レコードの索引付き表†
TABLE 型に RECORD 型を放り込むとあら不思議! 二次元配列! テーブルそのまんま!
- レコードの索引つき表
declare type foo is table of bar%rowtype index by pls_integer; hoge foo; begin hoge(1).baz := 100; end; /
バインド変数†
ホスト環境内に作成される変数。ホスト変数ともいう。
- SQL*Plus っていうアプリケーション上に変数を作って参照する。PL/SQL のブロックが終了してもアクセスできるので便利かもしれない
- バインド変数の宣言
-- SQL*Plus 上で行う。PL/SQL ファイルに含める場合は DECLARE の前 variable hoge number; declare fuga number; begin fuga := 10; -- バインド変数を呼び出す場合は接頭辞として : を付ける :hoge := fuga + 100; end; / -- SQL*Plus 上で print 文を発行するとバインド変数の一覧が表示される print print hoge- NUMBER 型の場合、桁数とか精度とかは指定できない
- DATE 型はない
%TYPE 属性†
データベースの列と同じ型を格納するように変数を宣言する。
変数に、ある表のある列から値を代入したいときに使う。表名と列名が明らかであれば、わざわざ表の列の型を調べなくていいし、ALTER TABLE によるテーブルの仕様変更にも自動で対応できる。
また、定義済みの変数と同じ型で別の変数を使いたいときにも使える。
ソースコードを見ただけでは型がわからない(もしくはわかりにくい)というデメリット もある。
- %TYPE 属性を付加した変数の宣言
declare -- employees 表の last_name 列の型で宣言する hoge employees.last_name%type; -- 変数 fuga と同じ型の変数 piyo を作る fuga number; piyo fuga%type; begin ... end; /
置換変数との差異†
混同しないように気をつけよう。
Last-modified: 2011-11-08 (火) 15:33:12