2016-09-07 6 views
0

これは単純だと思っていましたが、複数の組み合わせを試しましたが、PostgreSQLでそれらを受け入れることができません。それは、一致する関数がないと主張していますが、リストされた型は(以下の例に見られるように)私の定義された関数と明確に一致しています。このPostgres関数をカスタム列挙型入力と呼ぶにはどうしたらいいですか?

         List of data types 
Schema | Name | Internal name | Size | Elements | Access privileges | Description 
--------+--------+---------------+------+----------+-------------------+------------- 
public | levels | levels  | 4 | debug +|     | 
     |  |    |  | info +|     | 
     |  |    |  | warn +|     | 
     |  |    |  | critical |     | 

CREATE FUNCTION public."logEvent"(IN in_type text,IN in_priority public.levels,IN in_message text) 
    RETURNS void 
    LANGUAGE 'sql' 
    NOT LEAKPROOF 
AS $function$ 
INSERT INTO public.log (type,priority,message) VALUES (in_type, in_priority, in_message); 
$function$; 

失敗したクエリ:

SELECT 1 FROM public.logEvent('test'::text,'debug'::public.levels,'test from sql prompt'::text); 
ERROR: function public.logevent(text, levels, text) does not exist 
LINE 1: SELECT 1 FROM public.logEvent('test'::text,'debug'::public.l... 
        ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

代替関数の定義:これは関数呼び出しを作成、実行しようとすると私は同じエラーを取得:

CREATE FUNCTION public."logEvent"(IN in_type text, IN in_priority text, IN in_message text) 
    RETURNS boolean 
    LANGUAGE 'sql' 
    NOT LEAKPROOF 
AS $function$ 
SELECT public.logEvent(in_type, CAST(lower(in_priority) AS public.levels), in_message); 
$function$; 

答えて

2

あなたは、二ことを知っています引用符付きの識別子は大文字と小文字を区別しますか?

CREATE FUNCTION public."logEvent"

しかし:

SELECT 1 FROM public.logEvent

これは動作するはずです:曖昧さのワットがあることができれば

SELECT 1 FROM public."logEvent"('test', 'debug', 'test from sql prompt'); 

明示的な型キャストにのみ必要ですiはオーバーロードされた関数です。

残りの部分を二重引用符で囲むか、引用符で囲まれていない(事実上は小文字の)有効な識別子を使用する(スマート)ようにしてください。

+1

私はそれを知りませんでした(mySQLから来た)が、それは私の問題を説明して解決します。 create table構文はpgAdminによって生成されました。もし私が手で書いたのであれば、引用符を省略して後でさらに混乱するかもしれません;-)私は自分の関数の名前を変更し、to_the_underscore_namingの規則に切り替えます。 – Digicrat

関連する問題