web-dev-qa-db-ja.com

Postgresql 9.6最初に文字列としてキャストせずに関数が文字列を返そうとするエラー。

私はPostgreSQL(9.6)の学習を進めており、受け取ったエラーに少し混乱しています。次の関数を作成しようとすると、次のエラーが表示されます。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT 'Hello' , 'World' ;
$$
 LANGUAGE sql;

エラー:

    ERROR:  return type mismatch in function declared to return record
DETAIL:  Final statement returns unknown instead of text at column 1.
CONTEXT:  SQL function "helloworld"
SQL state: 42P13

テキストをテキストとしてキャストすると、正しく機能します。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT cast('Hello' as text) , cast('World' as Text);
$$
 LANGUAGE sql;

同じエラーで最初のシナリオでchar(10)とvarchar(10)も試しました。 「TABLE(HelloCol text、WorldCol text)」の部分で正しい変数の型を取得していないと思いますが、「Hello」がtext、char、またはvarcharでない場合、それは何ですか?いくつかの未定義のタイプですか?

返された列をintに変更してSelect 1,2にすると、キャストしなくても問題なく機能します。

5
BGCDC

これはバージョン10で修正されており、ドキュメント Type Conversions に示されています。

SELECT出力列

SELECTコマンドの単純な出力列として表示される未指定のタイプのリテラルを除いて、前のセクションで与えられたルールにより、SQLクエリのすべての式に未知のデータタイプが割り当てられます。たとえば、

 SELECT 'Hello World';

文字列リテラルがどのタイプとして扱われるべきかを識別するものは何もありません。この状況では、PostgreSQLはリテラルのタイプをtextとして解決します。

...

メモ
PostgreSQL 10より前このルールは存在しませんでした、およびSELECT出力リストの未指定のタイプのリテラルタイプunknown。それはさまざまな悪い結果をもたらしたので、変更されました。


あなたのためのソリューションは非常に簡単です:

値をtextにキャストするか、バージョン10にアップグレードします。

3
ypercubeᵀᴹ