概念実証
手順
できます 戻り値ですが、非常に限定された方法です(Postgres 13以降)。
CREATEPROCEDURE<のマニュアル/ code> :
したがって、 INOUT
の使用 モードは正しいです。ただし、関数本体の割り当てがありません。そして、他のいくつかのことが間違っている/最適ではありません。私が提案するもの:
CREATE OR REPLACE PROCEDURE public.spproductinsertupdatedelete(
_ser int
, _subcategid int
, _inrprice numeric
, _usdprice numeric
, _colour int
, _size int
, _qty int
, INOUT _prod_id int DEFAULT NULL
)
LANGUAGE plpgsql AS
$proc$
BEGIN
CASE _ser -- simpler than IF
WHEN 1 THEN -- INSERT
INSERT INTO product
(prod_subcateg_id, prod_inr_price, prod_usd_price, prod_colour, prod_size, prod_qty)
VALUES (_subcategid , _inrprice , _usdprice , _colour , _size , _qty )
RETURNING prod_id
INTO _prod_id; -- !!!
WHEN 2 THEN -- UPDATE
UPDATE product
SET (prod_subcateg_id, prod_inr_price, prod_usd_price, prod_size, prod_colour, prod_qty)
= (_subcategid , _inrprice , _usdprice , _size , _colour , _qty)
WHERE prod_id = _prod_id;
WHEN 3 THEN -- soft-DELETE
UPDATE product
SET prod_datetill = now()
WHERE prod_id = _prod_id;
ELSE
RAISE EXCEPTION 'Unexpected _ser value: %', _ser;
END CASE;
END
$proc$;
db <> fiddle こちら
これを概念実証として使用してください。しかし、 PROCEDURE<の使用を保証する質問には何も表示されません。 / code>
そもそも。
おそらく FUNCTION
が必要です。
FUNCTION
が必要です。
FUNCTION
値を返すためのより多くのオプションを提供します。CALL
で個別に実行する必要はありません。 、およびより大きなクエリに統合できます。たぶん、それはあなたが最初に望んでいたことであり、あなたはただ広まった誤った呼び名の「ストアドプロシージャ」によって誤解されていました。参照:
さらに、現在のフォームでは、行を更新またはソフト削除する場合は、多くのノイズパラメータを指定する必要があります。プレーンSQLコマンドがその役目を果たすかもしれません。または個別の機能...
経験則 :内部からトランザクションを管理する必要がない場合は、プロシージャの代わりに関数を使用することをお勧めします。後で、Postgresプロシージャを拡張して、複数の結果セットを返すことができるようにすることができます(SQL標準に従って)が、まだ(13ページ)。
参照:
- PostgreSQLでは、「ストアドプロシージャ」と他のタイプの関数の違いは何ですか?
- ストアドプロシージャはPostgresのデータベーストランザクションで実行されますか?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- 「ストアドプロシージャ」と「ストアド関数」の違いは何ですか?>