sql >> データベース >  >> RDS >> PostgreSQL

(関数ではなく)ストアドプロシージャから値を返す方法は?

    概念実証

    手順 できます 戻り値ですが、非常に限定された方法です(Postgres 13以降)。

    CALLのマニュアル :

    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 値を返すためのより多くのオプションを提供します。CALLで個別に実行する必要はありません。 、およびより大きなクエリに統合できます。たぶん、それはあなたが最初に望んでいたことであり、あなたはただ広まった誤った呼び名の「ストアドプロシージャ」によって誤解されていました。参照:

    さらに、現在のフォームでは、行を更新またはソフト削除する場合は、多くのノイズパラメータを指定する必要があります。プレーンSQLコマンドがその役目を果たすかもしれません。または個別の機能...

    経験則 :内部からトランザクションを管理する必要がない場合は、プロシージャの代わりに関数を使用することをお勧めします。後で、Postgresプロシージャを拡張して、複数の結果セットを返すことができるようにすることができます(SQL標準に従って)が、まだ(13ページ)。

    参照:




    1. サブクエリを相互にネストすることにより、MySQLの61テーブルのJOIN制限を回避します

    2. PostgreSQL 12:外部キーとパーティションテーブル

    3. CodeIgniter:データベースに画像を保存しますか?

    4. MySQLはVARCHARフィールドサイズをどのように解釈しますか?