DB/Oracle/PLSQL/プロシージャとファンクション

Top/DB/Oracle/PLSQL/プロシージャとファンクション

目次

使い捨ての無名なのじゃなくて、名前を付けて保存しておくプロシージャもしくはファンクションのお話。サブプログラム。


プロシージャとファンクション

名前を付けて保存しておくサブプログラムのこと。保存場所はローカルだったりサーバだったりする。名前を付けて保存してあるので、名前を指定してほかのアプリケーションからコール(実行)できる。

値を返さないのがプロシージャで、値を返すのがファンクション。プロシージャの中からファンクションを呼び出す、という形が多い。のかなあ。

プロシージャ

基本の構文

だいたい無名ブロックと一緒。

  • ストアドプロシージャの構文
  • パラメータのモード
    モード説明
    in呼び出し元から受け取るパラメータ。モードを省略するとこれになる
    out呼び出し元に返すパラメータ
    in out呼び出し元から受け取って返すパラメータ

実行方法

他の無名ブロックやプロシージャから実行する場合は、プロシージャ名を単に記述するだけ。

  • HOGE プロシージャを他のサブプログラムや無名ブロックから呼び出す

SQL*Plus から直接動かす場合は EXECUTE 文を用いる。引数の指定方法は上と一緒。

  • HOGE プロシージャを SQL*Plus から呼び出す

ファンクション

いわゆる関数。考え方は他言語と同じ。値を代入するためだったり、条件判定に使用したり、フィルタに使用したり、いろいろな目的に使える。

基本の構文

プロシージャとほとんど一緒。PROCEDURE が FUNCTION になったのと、返り値のための RETURN が増えた点だけが違う。

RETURN で返せるデータは一つだけ。

  • ストアドファンクションの構文

実行方法

  • HOGE ファンクションを他のサブプログラムや無名ブロックから呼び出す

SQL*Plus から直接動かす場合ってあんまりないと思うけど、DUAL 表からひいて使うとかかなあ。

  • HOGE ファンクションを SQL*Plus から呼び出す
    select hoge from dual;
    select hoge(10) from dual;
    

コンパイルとエラーの詳細

CREATE PROCEDURE したら『警告: プロシージャが作成されましたが、コンパイル・エラーがあります。』って怒られた。でもどこがエラーなんだか何も教えてくれない…… という腹立たしい事態に遭遇したときはおまじないを唱えると幸せになれる。

日本語はおかしいんだけどまあ…… ないよりまし……?

  • SHOW ERROR

Last-modified: 2011-11-09 (水) 14:21:42