Postgresql

Postgresql 9.6 嘗試讓函式返回字元串而不首先將其轉換為字元串時出錯。

  • February 23, 2018

我正在學習 PostgreSQL (9.6),對收到的錯誤感到有些困惑。如果我嘗試創建以下函式 II 收到以下錯誤。

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”不是文本、字元或 varchar,它是什麼?只是一些未定義的類型?

我可以將返回的列更改為 int 並讓它選擇 1,2 並且無需強制轉換就可以正常工作。

如文件Type Conversions中所示,這已在版本 10 中得到修復:

SELECT輸出列

前面部分中給出的規則將導致將非未知數據類型分配給 SQL 查詢中的所有表達式,但顯示為SELECT命令的簡單輸出列的未指定類型文字除外。例如,在

 SELECT 'Hello World';

沒有什麼可以確定字元串文字應該被視為什麼類型。在這種情況下,PostgreSQL 將回退到將文字的類型解析為text.

注意

在 PostgreSQL 10 之前,此規則不存在SELECT,並且輸出列表中未指定類型的文字保留為 typeunknown。這產生了各種各樣的不良後果,所以它被改變了。


您的解決方案非常簡單:

將值轉換為text或升級到版本 10。

引用自:https://dba.stackexchange.com/questions/198703