DB/Oracle/PLSQL/変数の利用

Top / 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ネストした表
    varrayvarray

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 (2533d)