Hatena::ブログ(Diary)

on the center line.

2008-03-11

PLS-00231: 関数XXXXXXはSQLでは使用できません、の原因

| 21:42

ファンクションXXXXXXを宣言しているにもかかわらず、

PLS-00231: 関数XXXXXXはSQLでは使用できません。

このエラーが発生。どうやらfunctionというのはprocedureと違って、パッケージ内プライベートとして作成することはできないみたい。なので、function XXXXXX の宣言をパッケージの方(パッケージボディではない方)に加えてやると万事解決。

create or replace package foo is
   function XXXXXX return date;

   -- and any definition....
end;

create or replace package foo is
   function XXXXXX return date is
   begin
      return add_months(trunc(sysdate,'MONTH'), 2);
   end;

   -- and any definition....
end;

PL/SQLでジェネリックなリストを使う

| 11:55

PL/SQLにはTable型というものがあり、これは簡単にいうと「ジェネリック型のリスト」ののような感じです。

declare
  type listClass is table of 社員%rowtype;
  list listClass;
begin
  select * bulk collect into list from 社員;
end;

このように使えるみたいです。次に、このリストを、戻り値として返す例です。

create package foo is
  -- リスト型の定義
  type listClass is table of 社員%rowtype;
  -- リスト型を返す関数の定義
  function bar return listClass;
end;

create or replace package body foo is

  function bar return listClass is
    -- リスト型オブジェクトを定義
    list listClass;
  begin
    -- bulk collect into を使って代入
    select * bulk collect into list from 社員;

    return list;
  end;
  
end;

見慣れない「bulk collect into 〜」を使う以外は、かなり直感的なプログラムだと思います。また、リストの要素型には以下のように、ユーザ定義型を指定することもできるようです。

create package foo is
  -- リストの要素型の定義
  type rowClass is record (id number, name varchar2(10));  
  -- リスト型の定義
  type listClass is table of rowClass;

ここでは「record」型として、ユーザ定義の型を定義しています。

ちなみに、functionの呼び出し元では、以下のようになります。

declare
    list foo.listClass;
begin
    list := foo.bar();

    -- 取得した内容を、デバッグ出力で確認
    for i in 1 .. list.count loop
      dbms_output.put_line(list(i).name);
    end loop;
end;

EclipseでEmacs風キーバインド Ctrl+M

| 10:53

EclipseEmacs風のキーバインドをするときの注意点。基本的には Scheme を「Emacs」にするだけで大体解決するんだけど、自分好みにするにはいくつかカスタマイズが必要。

  • Ctrl+H
    [In Window]の[Delete Previous]を割り当てる
  • Ctrl+Spc
    [Text Editing]の[Set Mark]を割り当てる
  • Ctrl+M
    何も割り当てないようにする

Ctrl+Mは「何も割り当てないと改行になる」っていうのがわからなくて、ひたすら探してました・・。

smithsmith 2009/06/04 14:14 >>Ctrl+M
Category->Window の Maximize Active View or Editor に何も割り当てないようにするんですね。
参考になりました。ありがとうございます〜

こころこころ 2011/10/24 15:47 参考になりましたです。

shuntakeuch1shuntakeuch1 2018/01/22 19:58 ありがとうございます。