Navicat Blog

使用 Navicat 17 擴展 PostgreSQL 資料類型 - 第 2 部分 2025 年 1 月 3 日,由 Robert Gravelle 撰寫

複合類型

歡迎來到本系列的第二部分,我們將使用 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 17Navicat for PostgreSQL 17 均提供建立類型的 GUI 工具,而無需了解所有準確的語法。你可以在主工具列的「其他」部分下找到這個功能:

type_menu_command (33K)

接下來,我們按一下「物件」工具列中「新增類型」項目旁邊的箭頭。這將顯示四種不同的建立類型選項。從選單中選取「複合」項目:

composite_menu_item (16K)

這將彈出一個網格,我們可以在其中輸入欄位的詳細資料。由於構成「film_summary」類型的三個欄位已經存在,因此我們可以使用資料表格設計器中開啟「film」資料表,並從那裡複製類型和長度資料。以下是用 紅色 標示的三個欄位:

fields_in_table_designer (85K)

網格的第一個欄位已經有一個空白行用於加入第一個欄位。輸入詳細資料後,我們可以按一下「新增成員」來新增一行。以下是完成設定的網格:

composite_type_fields (30K)

在按下「儲存」按鈕之前,我們可以透過按一下「SQL 預覽」索引標籤來查看 Navicat 產生的陳述式:

sql_preview_tab (22K)

請注意,由於我們尚未儲存定義,類型名稱為「未命名」。這是預期的。

現在讓我們指定名稱。按一下「儲存」按鈕會彈出「另存為」對話方塊,在這裡我們可以輸入類型名稱「film_summary」:

save_as_dialog (31K)

在函式中使用 film_summary 類型

現在是時候將「film_summary」用作函式的回傳類型了。與建立類型一樣,我們將使用 Navicat 的 GUI 工具來完成此作業。若要存取函式設計器,請按一下主工具列上的「函式」按鈕,然後按一下「物件」工具列上的「新增函式」:

function_buttons (23K)

編輯器將為我們預先填入 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;
get_film_summary_function_definition (40K)

同時確保將語言設定為「SQL」。

按下「儲存」按鈕後,我們的函式就可以使用了。試用函式的最快、最簡單的方法是按一下「執行」按鈕。這會彈出一個提示,讓我們為「f_id」參數提供一個值:

input_parameter_prompt (35K)

結果應該會出現在一個新的「結果」索引標籤中:

function_results (28K)

總結

在本文中,我們使用 Navicat Premium 17 的類型工具建立了一個複合類型,並設計了一個傳回類型的函式。我們將在第三部分中繼續介紹列舉類型。

Navicat Blogs
Feed Entries
Blog Archives
Share