2012年7月13日金曜日

[Oracle]pl/sqlの変数宣言

PL/SQLの変数宣言のまとめ

変数

declare
  -- 初期値なしで変数宣言
  v1 char(1);
  -- 初期値ありで変数宣言
  v2 varchar2(100) default 'ほげ';
  -- 他の変数の型で変数宣言
  v3 v2%type default 'ふが';
begin
  dbms_output.put_line(v1);
  dbms_output.put_line(v2);
  dbms_output.put_line(v3);
end;
/

定数

declare
  const_name constant varchar2(100) not null default '定数';
begin
  dbms_output.put_line(const_name);
end;
/

------------------------------
-- 実行結果
------------------------------
定数

PL/SQLプロシージャが正常に完了しました。

定数値を変更しようとすると例外が発生します。
-- 定数値を変更するステートメントを追加した場合
const_name := '書き換え';

------------------------------
-- 実行結果
------------------------------
行5でエラーが発生しました。:
ORA-06550: 行5、列3:
PLS-00363: 式CONST_NAMEは割当てターゲットとして使用できません。
ORA-06550: 行5、列3:
PL/SQL: Statement ignored

NULL不可変数

declare
  -- not nullを属性をつけることで、nullの代入がNGとなる。
  v1 char(1) not null default '1';
begin
  dbms_output.put_line(v1);
end;
/

procedureでnull不可の変数に「null」を代入しようとするとコンパイルエラーとなる
create or replace procedure hoge
is
  -- 初期値なしで変数宣言
  v1 char(1) not null default '1';
  v2 char(1);
begin
  v1 := null;
end;
/

LINE/COL ERROR
-------- -----------------------------------------------------------------
7/3      PL/SQL: Statement ignored
7/9      PLS-00382: 式の型が正しくありません。

procedureでnull不可の変数に別の変数の値を代入した場合、実行時エラーとなる
  1  create or replace procedure hoge
  2  is
  3    -- 初期値なしで変数宣言
  4    v1 char(1) not null default '1';
  5    v2 char(1);
  6  begin
  7    v1 := v2;
  8* end;
16:50:25 SQL> /

プロシージャが作成されました。

経過: 00:00:00.01
16:50:26 SQL> exec hoge
BEGIN hoge; END;

*
行1でエラーが発生しました。:
ORA-06502: PL/SQL: 数値または値のエラーが発生しました
ORA-06512: "HOGE", 行7
ORA-06512: 行1