GeneXusで作ったオブジェクトからストアドプロシージャは呼べるかと言う質問をいただきました。
いつも回答に困るので、今回記事にしようと思いました。
まず回答としてはストアドプロシージャは呼べます。
ただ条件がいくつかあります。
まずGeneXusからストアドプロシージャを呼ぶ場合は、外部オブジェクトを使用するのですが、この外部オブジェクトを使って呼ぶ方法は、ストアドがレコードセットの戻り値を返す場合は、それを受け取ることができません。
レコードセットと言うのは、行と列で返ってくるデータです。
下記のようなデータです。
では何が戻り値として受け取れるかと言うと、コレクション型ではない戻り値のみ受け取れます。
データをInsertしたりUpdateするストアドで、成功したor失敗したを返す場合、それを戻り値として受け取れます。
では実際にストアドを作って、GeneXusから呼んでみましょう。
ストアド作成
まずはデータをInsertして、成功の場合はTrue、失敗(キー重複)の場合はFalseを返すストアドを用意します。
今回は簡単に下記のような感じにしました。
(DBMSはPostgresです)
CREATE OR REPLACE FUNCTION ins_shotr()
RETURNS BOOLEAN
AS
$$
BEGIN
INSERT INTO shotr(shoid, shonm) VALUES (3, 'ガム');
RETURN TRUE;
EXCEPTION WHEN unique_violation THEN
RETURN FALSE;
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION ins_shotr()
RETURNS BOOLEAN
AS
$$
BEGIN
INSERT INTO shotr(shoid, shonm) VALUES (3, 'ガム');
RETURN TRUE;
EXCEPTION WHEN unique_violation THEN
RETURN FALSE;
END;
$$
LANGUAGE plpgsql;
下記のようなデータがある状態でSQLを流してストアドを実行します。
想定通りTrueが返ってきました。
データも増えてます。
では次はこのストアドをGeneXusから呼んでみましょう。
GeneXusで外部オブジェクト作成
GeneXusでストアドを呼ぶには、まず新規オブジェクトからExternal Object(外部オブジェクト)を選択して作成します。
その後、作成した外部オブジェクトのプロパティを変更します。
Type:Stored Procedure
Datastore:(ストアドがあるデータストア)
外部オブジェクトの設定は下記のようにしました。
ins_shotrのプロパティとIsSuccessのプロパティは下記です。
ストアド名と合わせて「ins_shotr」にしましたが、ストアド名と異なる場合はExternal Nameにストアド名を設定してください。
これで外部オブジェクトは完成です。
外部オブジェクトの呼び出し
続きましてWebパネルを作ります。
その後ボタンを置いて、ボタン押下で外部オブジェクト経由でストアドを呼びます。
Web Layout
Events
今回は簡易的に、ボタンを押したら外部オブジェクトを呼んで、戻り値がTrueだとコミットして正常のメッセージ、Falseだとロールバックして異常のメッセージを出すことにしました。
外部オブジェクトの動作確認
早速実行してみます。
ボタン押下で正常に動作しました。
データベースにも正常に登録されてますね。
この状態でもう一回ボタンを押してみます。
キー重複でエラーになりましたね。
これで外部オブジェクトでのストアド呼び出しは終了になります。
今回のような簡単な処理でしたらストアドに記載するのではなく、GeneXus内で完結させた方が圧倒的に良いです。
しかしどうしても使いたいストアドがあって、それをGeneXusで実装するのはコストがかかる等だと外部オブジェクトを使っての呼び出しも仕方ないかなと思います。
ただ最初にも記述しました通りレコードセットを受け取れませんので、注意が必要です。
次回は外部オブジェクトを使わないでストアドを呼ぶ方法について書こうと思います。
(その方法はレコードセット型が受け取れます)
追記
外部オブジェクトを使わないでストアドを呼ぶ方法を記載しました。
こちら