2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

42.2. PL/Tcl 函式和引數 #

要使用 PL/Tcl 語言建立函式,請使用標準的 CREATE FUNCTION 語法。

CREATE FUNCTION funcname (argument-types) RETURNS return-type AS $$
    # PL/Tcl function body
$$ LANGUAGE pltcl;

PL/TclU 也是如此,不同之處在於必須將語言指定為 pltclu

函式的體只是一個 Tcl 指令碼片段。當呼叫函式時,引數值會作為名為 1...n 的變數傳遞給 Tcl 指令碼。結果以通常方式從 Tcl 程式碼返回,使用 return 語句。在過程中,Tcl 程式碼的返回值將被忽略。

例如,一個返回兩個整數值中較大者的函式可以定義為

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl STRICT;

注意 STRICT 子句,這使我們不必考慮 NULL 輸入值:如果傳遞了 NULL 值,函式將根本不會被呼叫,而是會自動返回 NULL 結果。

在非嚴格函式中,如果引數的實際值為 NULL,則相應的 $n 變數將被設定為空字串。要檢測特定引數是否為 NULL,請使用 argisnull 函式。例如,假設我們希望 tcl_max 在一個引數為 NULL 而另一個不為 NULL 時返回非 NULL 引數,而不是 NULL。

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {[argisnull 1]} {
        if {[argisnull 2]} { return_null }
        return $2
    }
    if {[argisnull 2]} { return $1 }
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl;

如上所示,要從 PL/Tcl 函式返回 NULL 值,請執行 return_null。無論函式是否為嚴格函式,都可以這樣做。

複合型別引數作為 Tcl 陣列傳遞給函式。陣列的元素名稱是複合型別的屬性名稱。如果傳入行中的屬性值為 NULL,則它不會出現在陣列中。下面是一個示例。

CREATE TABLE employee (
    name text,
    salary integer,
    age integer
);

CREATE FUNCTION overpaid(employee) RETURNS boolean AS $$
    if {200000.0 < $1(salary)} {
        return "t"
    }
    if {$1(age) < 30 && 100000.0 < $1(salary)} {
        return "t"
    }
    return "f"
$$ LANGUAGE pltcl;

PL/Tcl 函式也可以返回複合型別結果。為此,Tcl 程式碼必須返回一個與預期結果型別匹配的列名/值對列表。列表中省略的任何列名都將返回為 NULL,並且如果存在意外的列名,則會引發錯誤。下面是一個示例。

CREATE FUNCTION square_cube(in int, out squared int, out cubed int) AS $$
    return [list squared [expr {$1 * $1}] cubed [expr {$1 * $1 * $1}]]
$$ LANGUAGE pltcl;

過程的輸出引數以相同的方式返回,例如

CREATE PROCEDURE tcl_triple(INOUT a integer, INOUT b integer) AS $$
    return [list a [expr {$1 * 3}] b [expr {$2 * 3}]]
$$ LANGUAGE pltcl;

CALL tcl_triple(5, 10);

提示

結果列表可以透過 Tcl 命令 array get 從所需元組的陣列表示中構成。例如。

CREATE FUNCTION raise_pay(employee, delta int) RETURNS employee AS $$
    set 1(salary) [expr {$1(salary) + $2}]
    return [array get 1]
$$ LANGUAGE pltcl;

PL/Tcl 函式可以返回集合。為此,Tcl 程式碼應為要返回的每一行呼叫一次 return_next,在返回標量型別時傳遞適當的值,或在返回複合型別時傳遞列名/值對的列表。下面是一個返回標量型別的示例。

CREATE FUNCTION sequence(int, int) RETURNS SETOF int AS $$
    for {set i $1} {$i < $2} {incr i} {
        return_next $i
    }
$$ LANGUAGE pltcl;

下面是一個返回複合型別的示例。

CREATE FUNCTION table_of_squares(int, int) RETURNS TABLE (x int, x2 int) AS $$
    for {set i $1} {$i < $2} {incr i} {
        return_next [list x $i x2 [expr {$i * $i}]]
    }
$$ LANGUAGE pltcl;

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用 此表單 報告文件問題。