DB/Oracle/PLSQL/書き方

Top/DB/Oracle/PLSQL/書き方

目次

実行文、すなわちプログラム本体の書き方に関する諸々。諸々って便利な言葉だなあ。


コメントの記述

ソースコードの中にコメントを記述する。

  • コメント
    -- 一行のコメントはハイフン二つ。改行コードまでがコメント扱い
    
    /* 複数行のコメントはこれ。
       改行コードは無視されるのでいくらでもかける */
    

組み込み関数

Oracle のもともと持っている関数はだいたい PL/SQL でも使える。単一行関数とか。

ただし、DECODE 関数とグループ関数は使えない。

  • 組み込み関数
    declare
        hoge varchar2(10) := 'fuga';
        piyo number := length(hoge);
    ...
    

型変換

考え方は SQL のと似ている。暗黙的に変換できるもの(文字と数値、文字と日付)もあれば、明示的に変換しなければいけないものもある。

パフォーマンスを考える上では、明示的に変換したほうが早い。

明示的型変換は結局は組み込みの関数の利用なので、上でも書いたけど、SQL と同じのが使えるよ、という話。

  • 型変換
    declare
        -- 暗黙的型変換
        hoge date := '11-11-11'
    
        -- 明示的型変換
        fuga varchar2 := to_char(hoge);
    ...
    

順序の利用

11g からはシーケンスをプロシージャ文で直接呼べるようになったらしい。すばらしい。

  • 順序
    declare
        hoge number;
    begin
        -- シーケンスから直接値を拾える
        hoge := fuga.nextval;
    
        -- 10g 以前では select を活用する必要があったらしい
        select fuga.nextval into hoge from dual;
    end;
    /
    

ブロックのネスト

実行部では、ブロックがネストできる。宣言部ではできないので注意。

  • ネスト
    declare
        hoge number;
    begin
        -- ネストする
        declare
            fuga number;
        begin
            fuga := 100;
        end;
    end;
    /
    

スコープ

  • 親ブロックで宣言された変数は、子ブロックから参照、更新できる
    • 親子間は参照渡しのような挙動。子ブロックから親の変数を更新できる
  • 親ブロックで宣言された変数と同じ名前を持つ変数を、子ブロックでも宣言できる
    • 内部的に別の変数として扱われるので、親ブロックの変数への影響はない
    • 参照時はまずはローカル変数から探す
    • 子ブロックから親ブロックの同名変数を参照する場合はラベルを使う
  • スコープ
    declare
        hoge number := 100;
    begin
        -- ネストする
        declare
            fuga number := 200;
        begin
            -- 親ブロックで宣言した変数は子ブロックでも参照できる
            dbms_output.put_line(hoge);
    
            -- 親ブロックで宣言した変数は子ブロックから更新できる
            hoge := 300
        end;
    
        -- 子ブロックで宣言した変数は親ブロックでは参照できない
        dbms_output.put_line(fuga);
    
        -- 親ブロックで宣言して子ブロックで変更した変数は親でも変更される(300 が出力)
        dbms_output.put_line(hoge);
    
    end;
    /
    
  • ラベル
    -- ブロックにラベルを付加する
    <<hoge>>
    declare
        foo number := 100;
    begin
        -- 子ブロックにもラベルの付加は可能
        <<fuga>>
        declare
            -- 親の持つ変数と同名の変数を定義できる
            foo number := 200;
        begin
            -- ラベルなしで参照するとローカルを探す(200 が出力)
            dbms_output.put_line(foo);
    
            -- 親のラベルを付加すると同名の親の変数を参照可能(100 が出力)
            dbms_output.put_line(hoge.foo);
        end;
    end;
    /
    

演算子

基本的には SQL と同じ。指数を計算するための ** が増えたくらい。あんまり使わない気がする。

  • 演算子
    declare
        -- 3 の 2 乗として 9 が入る
        hoge number := 3**2
    ...
    
    • SQL での指数の指定は power(n, m) だよ

Last-modified: 2011-11-08 (火) 17:15:55