[Seasar-user:21756] Re: 【DBFlute】ストアド・ファンクションのCreate文はどこに置くのでしょうか

kubo [E-MAIL ADDRESS DELETED]
2013年 11月 18日 (月) 23:15:35 JST


久保(jflute)です

こんばんわ、yoshiさん
DBFluteご利用ありがとうございます!

ストアドプロシージャの作成に関しては、
固定のものであれば playsql で管理するのが推奨です。
つまりこちらですね。

> 1.playsqlの下に配置してreplace-schemaタスクで作成されるようにする。

ただ、SQLファイル内のSQLのデリミタがデフォルトでセミコロンなので、
そのまま貼付けてもセミコロンで分割されてしまいます。
そこで、「ここからここまでが一つのSQL」というような指定ができます。

-- #df:begin#
create or replace procedure SP_NO_PARAMETER
as
begin
  dbms_output.put_line('aaa');
end SP_NO_PARAMETER;
/
-- #df:end#

// SQLの範囲の明示的指定
http://dbflute.seasar.org/ja/manual/function/generator/task/replaceschema/createtable.html#beginend

ぜひ、こちらを試してみてください。

2013/11/18  <yo-kitano @ sknet.senko.co.jp>:
>
> こんばんわ、yoshiです。
>
> DBFlute1.0.5A / Oracle(10g)を使用しています。
>
>  ストアド・ファンクションを使用しているのですが
>
>  ストアド・ファンクションのCreate文はどこに置くのが正しいやり方でしょうか?
>
> 1.playsqlの下に配置してreplace-schemaタスクで作成されるようにする。
>
> 2.外出しSQLと同じ所に配置してsql2entityタスクで作成されるようにする。
>
>
> 1のやり方で行うとなぜか以下のエラーが発生し作成されません。
>
> [SQLException]
> java.sql.SQLException
> ORA-06550: 行3、列10:
> PLS-00103: 記号"end-of-file"が見つかりました。 次のうちの1つが入るとき:
>
>    . ( * @ % & = - + ; < / > at in is mod remainder not rem
>    <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
>    LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
>
> その他のオラクルのクライアントで作成すると問題なく作成できます。
>
> 2のやり方で行うと、そのストアドファンクションを使うSQLが先に実行され
> エラーになってしまいます。
>
> 作成しようとしているストアドファンクションは以下の様なものです。
>
> CREATE OR REPLACE FUNCTION getNmArrivshipKb(kbArrivship in
> MA_CODE.CD_DETAIL%TYPE) return nvarchar2 is
>   ret MA_CODE.NM_DETAIL%TYPE;
> begin
>   select NM_DETAIL into ret
>   from MA_CODE
>   where KB_SYSTEM = 'CMN'
>   and CD_DIVIDE = 'KB_ARRIVSHIP'
>   and CD_DETAIL = kbArrivship;
>   return ret;
> exception
> when others then
>   return null;
> end;
>
> ご存知のかたがおられましたらよろしくお願いします。
>
> 以上、よろしくお願いいたします。
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内