web-dev-qa-db-ja.com

文字列値を列挙型にキャストする方法

enum型のテーブルがあり、そのテーブルにデータを追加する関数を作成しました。その関数で何を受け入れるかを寛大にしたいので、列挙型としてtextを取り、後でキャストしたいと思います。

これは列挙型です:

CREATE TYPE public.enum_log_priority AS ENUM (
    'critical','error','warning','notice','debug'
);

そしてこれは機能です:

CREATE OR REPLACE FUNCTION public.log_write(
    _message text,
    _priority text
) RETURNS integer AS
$body$
BEGIN
    _priority = lower(_priority);
    INSERT INTO log (message, priority) VALUES (_message, _priority);

    RETURN 0;
END
$body$
LANGUAGE 'plpgsql';

私はこれが機能しないことを知っています:

エラー:列 "priority"はタイプenum_log_priorityですが、式はタイプtextです

しかし、どうすればこれを行うことができますか?

22
31
Rakesh Soni

次のように関数を変更します。

CREATE OR REPLACE FUNCTION public.log_write(
    _message text,
    _priority text
) RETURNS integer AS
$body$
BEGIN
    _priority = lower(_priority);
    INSERT INTO log (message, priority) VALUES (_message, _priority::enum_log_priority);

    RETURN 0;
END
$body$
LANGUAGE 'plpgsql';

| sqlフィドルデモ|

2
Roman Pekar