37.2. 開發 PL/pgSQL 的一些提示

PL/pgSQL 做開發的一個好方法是簡單地使用你喜歡的文本編輯器創建你的函數,然後在另外一個控制台裡, 用 psql 裝載這些函數。如果你用這種方法, 那麼用 CREATE OR REPLACE FUNCTION 寫函數是個好主意。這樣,你就可以重載文件以更新函數定義。比如:

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS '
    ....
END;
' LANGUAGE plpgsql;

在運行 psql 的時候,你可以用下面命令裝載或者重載這樣的函數定義文件

\i filename.sql

然後馬上發出 SQL 命令測試該函數。

另外一個開發PL/pgSQL程序的好方法是用一種 GUI 的數據庫訪問工具,並且是實現了過程語言開發設施的那種。 這種工具中的一種就是 pgaccess,當然還有其他的。 這些工具通常提供了一些很有用的功能,比如逃逸單引號,令重建和調試函數更簡單等。

37.2.1. 處理引號

因為 PL/pgSQL 函數的代碼都是在 CREATE FUNCTION 裡以一個字串文本的方式聲明的, 所以,在函數體內的單引號必須進行逃逸。 這樣可能會在某些情況下產生相當復雜的代碼,尤其是你在寫一個生成其它函數的函數的時候, 就像在 Section 37.6.4 裡的那樣。 下面的列表給你一個在不同情況下需要的引號數目的概述。

1 個單引號

開始/結束函數體,比如:

CREATE FUNCTION foo() RETURNS integer AS '...'
    LANGUAGE plpgsql;

在函數體內部的任何位置,問號都必須成對出現。

2 個單引號

對于函數體內的字串文本,比如:

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

第二行被 PL/pgSQL 看作

SELECT * FROM users WHERE f_name='foobar';

4 個單引號

如果你在函數體裡的字串裡面需要一個單引號,比如:

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

a_output 會是: AND name LIKE 'foobar' AND xyz

6 個單引號

如果一個在函數體裡的字串中的單引號與該字串常量結尾前後相連, 比如:

a_output := a_output || '' AND name LIKE ''''foobar''''''

a_output 的值將是: AND name LIKE 'foobar'

10 個單引號

如果你想要在字串常量裡有兩個單引號(它們在一起是 8 個了), 並且這兩個單引號和該字串常量的結尾相連(又加 2 個)。 你可能只有在寫一個生成其它函數的函數的時候才需要這麼幹。比如:

a_output := a_output || '' if v_'' ||
    referrer_keys.kind || '' like ''''''''''
    || referrer_keys.key_string || ''''''''''
    then return ''''''  || referrer_keys.referrer_type
    || ''''''; end if;'';

a_output 的數值會是:

if v_... like ''...'' then return ''...''; end if;

另外一個方法是用反斜槓逃逸函數體裡面的單引號,而不是寫雙份。 用這個方法,你會發現自己寫了很多類似 \'\' 這樣的東西, 而不是 ''''。有些人認為這樣簡單些,有些人卻不這麼看。