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

テキストまたは整数値を返す関数を作成するにはどうすればよいですか?

    おそらく必要なもの

    ほとんどの場合、textを返すために1つの関数が必要です もう1つはintegerを返します またはbooleanを返す関数 成功を示すために。これはすべて些細なことであり、CREATE FUNCTIONに関する優れたマニュアルを参照します。 またはSOに関する同様の質問のコード例。

    実際に質問したこと

    テキストまたは整数値を返す関数を作成するにはどうすればよいですか?

    ...1つあるという意味で 戻り値のタイプはtextのいずれかです またはinteger 。ささいなことではありませんが、提案されているように不可能でもありません。キーワードは次のとおりです。多形型

    この単純なテーブルに基づいて構築する:

    CREATE TABLE tbl(
      tbl_id int,
      txt    text,
      nr     int
    );
    

    この関数は、入力タイプに応じて、整数またはテキスト(または許可されている場合は他のタイプ)を返します。

    CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
      RETURNS anyelement AS
    $func$
    BEGIN
    
    CASE pg_typeof(_data) 
    WHEN 'text'::regtype THEN
        INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
        RETURNING txt
        INTO _result;
    
    WHEN 'integer'::regtype THEN
        INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
        RETURNING nr
        INTO _result;
    
    ELSE
        RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
    END CASE;
    
    END
    $func$
    LANGUAGE plpgsql;
    

    電話:

    SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
    SELECT f_insert_data(1, 7);
    

    シンプルなケース

    1つ TRUEを返す関数 / FALSE 行が挿入されたかどうかを示すために、さまざまなタイプの1つの入力パラメーターのみ:

    CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
      RETURNS boolean AS
    $func$
    BEGIN
    
    CASE pg_typeof(_data)
    WHEN 'text'::regtype THEN
       INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);
    
    WHEN 'integer'::regtype THEN
       INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);
    
    ELSE
       RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
    END CASE;
    
    IF FOUND THEN RETURN TRUE;
    ELSE RETURN FALSE;
    END IF;
    
    END
    $func$
    LANGUAGE plpgsql;
    

    入力タイプはtextに置き換えることができます ほとんどの目的でパラメータ。他のタイプとの間でキャストできます。



    1. データベース列のビットフラグに不利な点はありますか?

    2. unsigned int / long型をEntityFrameworkで使用するにはどうすればよいですか?

    3. max_allowed_pa​​cketサイズを変更する方法

    4. OracleでのページングのためのLIMITおよびOFFSETの代替