Postgresql
Postgresql 9.6 嘗試讓函式返回字元串而不首先將其轉換為字元串時出錯。
我正在學習 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 中得到修復:
前面部分中給出的規則將導致將非未知數據類型分配給 SQL 查詢中的所有表達式,但顯示為
SELECT
命令的簡單輸出列的未指定類型文字除外。例如,在SELECT 'Hello World';
沒有什麼可以確定字元串文字應該被視為什麼類型。在這種情況下,PostgreSQL 將回退到將文字的類型解析為
text
.…
注意
在 PostgreSQL 10 之前,此規則不存在
SELECT
,並且輸出列表中未指定類型的文字保留為 typeunknown
。這產生了各種各樣的不良後果,所以它被改變了。您的解決方案非常簡單:
將值轉換為
text
或升級到版本 10。