私は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にすると、キャストしなくても問題なく機能します。
これはバージョン10で修正されており、ドキュメント Type Conversions に示されています。
SELECT
コマンドの単純な出力列として表示される未指定のタイプのリテラルを除いて、前のセクションで与えられたルールにより、SQLクエリのすべての式に未知のデータタイプが割り当てられます。たとえば、SELECT 'Hello World';
文字列リテラルがどのタイプとして扱われるべきかを識別するものは何もありません。この状況では、PostgreSQLはリテラルのタイプを
text
として解決します。...
メモ
PostgreSQL 10より前このルールは存在しませんでした、およびSELECT
出力リストの未指定のタイプのリテラルタイプunknown
。それはさまざまな悪い結果をもたらしたので、変更されました。
あなたのためのソリューションは非常に簡単です:
値をtext
にキャストするか、バージョン10にアップグレードします。