複合類型
歡迎來到本系列的第二部分,我們將使用 Navicat Premium 17 PostgreSQL 中建立自訂資料類型。在 第一部分 中,我們學習了如何為免費的 DVD 租賃資料庫 建立自訂網域(Domain)。網域一種具有 NOT NULL 和 CHECK 等限制的使用者定義資料類型。在今天的文章中,我們將建立一個複合類型,從使用者定義的函式傳回複雜資料。
PostgreSQL 類型的定義
類型是使用 CREATE TYPE 指令產生的。它會建立一個複合類型,可以在預存程序和函式中用作輸入參數和傳回值的資料類型。
PostgreSQL 的 CREATE TYPE 支援四種主要變體:
- 複合類型:定義組合兩種或多種資料類型的複合資料。允許建立可以表示複雜資料結構的複雜、多欄位資料類型。
- 列舉類型:定義為一組固定的預定義命名值,將輸入限制為僅限於這些特定選項。
- 範圍類型:表示值之間的連續間隔,支援對日期或數字等連續資料範圍進行複雜的作業。
- 基本類型:基於現有的基本類型(如 int、varchar 或 numeric)建立使用者定義類型。雖然使用者定義類型沒有特定的「基本類型」,但新類型本質上是應用於這些底層 PostgreSQL 基本類型的擴展或約束。
在接下來的幾個部分中,我們將透過建立類型並在函式中使用它來深入探討複合類型。
CREATE TYPE 陳述式
所有類型都是使用 CREATE TYPE 陳述式建立的。假設我們想要建立一個函式傳回關於電影的幾個值,例如電影 ID、標題和發行年份。以下是建立名為「film_summary」類型的陳述式:
CREATE TYPE film_summary AS ( film_id INT4, title VARCHAR(255), release_year CHAR(4) );
在 Navicat 17 中建立類型
Navicat Premium 17 和 Navicat for PostgreSQL 17 均提供建立類型的 GUI 工具,而無需了解所有準確的語法。你可以在主工具列的「其他」部分下找到這個功能:
接下來,我們按一下「物件」工具列中「新增類型」項目旁邊的箭頭。這將顯示四種不同的建立類型選項。從選單中選取「複合」項目:
這將彈出一個網格,我們可以在其中輸入欄位的詳細資料。由於構成「film_summary」類型的三個欄位已經存在,因此我們可以使用資料表格設計器中開啟「film」資料表,並從那裡複製類型和長度資料。以下是用 紅色 標示的三個欄位:
網格的第一個欄位已經有一個空白行用於加入第一個欄位。輸入詳細資料後,我們可以按一下「新增成員」來新增一行。以下是完成設定的網格:
在按下「儲存」按鈕之前,我們可以透過按一下「SQL 預覽」索引標籤來查看 Navicat 產生的陳述式:
請注意,由於我們尚未儲存定義,類型名稱為「未命名」。這是預期的。
現在讓我們指定名稱。按一下「儲存」按鈕會彈出「另存為」對話方塊,在這裡我們可以輸入類型名稱「film_summary」:
在函式中使用 film_summary 類型
現在是時候將「film_summary」用作函式的回傳類型了。與建立類型一樣,我們將使用 Navicat 的 GUI 工具來完成此作業。若要存取函式設計器,請按一下主工具列上的「函式」按鈕,然後按一下「物件」工具列上的「新增函式」:
編輯器將為我們預先填入 CREATE FUNCTION 的大部分語法;我們只需要提供某些資料,例如函式名稱、輸入參數、傳回類型和函式主體。以下是完整的 CREATE FUNCTION 陳述式:
CREATE FUNCTION get_film_summary (f_id INT4) RETURNS film_summary AS $BODY$ SELECT film_id, title, release_year FROM film WHERE film_id = f_id; $BODY$ LANGUAGE SQL VOLATILE;
同時確保將語言設定為「SQL」。
按下「儲存」按鈕後,我們的函式就可以使用了。試用函式的最快、最簡單的方法是按一下「執行」按鈕。這會彈出一個提示,讓我們為「f_id」參數提供一個值:
結果應該會出現在一個新的「結果」索引標籤中:
總結
在本文中,我們使用 Navicat Premium 17 的類型工具建立了一個複合類型,並設計了一個傳回類型的函式。我們將在第三部分中繼續介紹列舉類型。