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

Postgres関数はループを終了してエラーを返します

    OUTを使用します パラメータ 複数の列を持つ単一の行を返します。 RETURN この場合、タイプはオプションです。マニュアルを引用しますこちら> :

    CREATE OR REPLACE FUNCTION conta_relatos(
        _fator_normativo integer
       ,_fator_determinativo integer
       ,OUT rel_pri integer
       ,OUT rel_sec integer
       ,OUT rel_ref integer
       ) AS
    $func$
    DECLARE
       tipo_relato text;
    BEGIN
    
    rel_pri := 0;
    rel_sec := 0;
    rel_ref := 0;
    
    FOR tipo_relato IN
       SELECT f."Tipo_Relato"
       FROM   "Vinculos" v
       JOIN   "Fontes"   f ON f."ID" = v."Item"
       WHERE  v."Fator_Normativo" = _fator_normativo
       AND    v."Fator_Determinativo" = _fator_determinativo
    LOOP
       CASE tipo_relato
       WHEN '1 - Relato Primário' THEN 
          rel_pri := rel_pri + 1;
       WHEN '2 - Relato Secundário' THEN 
          rel_sec := rel_sec + 1;
       WHEN '3 - Relato Referencial' THEN 
          rel_ref := rel_ref + 1;
       END CASE;
    END LOOP;
    
    -- No RETURN needed, OUT parameters are returned automatically.
    
    END
    $func$ LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM conta_relatos(1,2);
    

    また、機能を大幅に簡素化しました。とりわけ:

    • "SimpleCASE"を使用> あなたの割り当てのために。
    • 結合を使用して、2つのクエリを1つに簡略化します。

    関数全体を単一のSQLステートメントとして簡単に書き直すことができます。



    1. SQLServerはVarcharを日時に変換します

    2. SELECT WHERE IN(サブクエリ)slow

    3. OracleのDMSクラスファイルはどこにありますか?

    4. MySQL:#1075-テーブル定義が正しくありません。自動インクリメントと別のキー?