?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
用PL/pgSQL做開發(fā)的一個(gè)好方法是簡(jiǎn)單地使用文本編輯器創(chuàng)建函數(shù), 然后在另外一個(gè)控制臺(tái)里,用 psql加載這些函數(shù)。 如果你用這種方法,那么用CREATE OR REPLACE FUNCTION寫函數(shù)是個(gè)好主意。 這樣,重讀文件就可以更新函數(shù)定義。比如:
CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $$ .... $$ LANGUAGE plpgsql;
在運(yùn)行psql的時(shí)候,可以用下面命令加載或者重載函數(shù)定義文件
\i filename.sql
然后馬上發(fā)出SQL命令測(cè)試該函數(shù)
另外一個(gè)開發(fā)PL/pgSQL程序的好方法是使用一種支持過程語言開發(fā)的GUI工具。 比如pgAdmin,當(dāng)然還有其它的。 這些工具通常提供了一些很有用的功能,比如逃逸單引號(hào)使得重建和調(diào)試函數(shù)更簡(jiǎn)單等。
PL/pgSQL函數(shù)的代碼都是在CREATE FUNCTION里以一個(gè)字符串文本的方式聲明的。 如果你用兩邊包圍單引號(hào)的常規(guī)方式寫字符串文本,那么任何函數(shù)體內(nèi)的單引號(hào)都必須寫雙份; 類似的是反斜杠也必須雙份。 雙份引號(hào)非常乏味,在更復(fù)雜的場(chǎng)合下,代碼可能會(huì)讓人難以理解, 因?yàn)槟愫苋菀装l(fā)現(xiàn)自己需要半打甚至更多相連的引號(hào)。 建議你用"dollar-quoted"的字符串文本來寫函數(shù)體。 (參閱 Section 4.1.2.4)。使用美元符界定的時(shí)候,你從不需要對(duì)任何引號(hào)寫雙份, 只需要為每層引號(hào)包圍嵌套選擇一個(gè)不同的美元符號(hào)包圍分隔符即可。 比如,你可能這么寫CREATE FUNCTION命令:
CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $PROC$ .... $PROC$ LANGUAGE plpgsql;
在這個(gè)函數(shù)體中,可以在 SQL 命令里使用單引號(hào)包圍文本字符串,用$$分隔那些 SQL 命令的片斷。 如果你需要對(duì)包含$$的文本進(jìn)行引號(hào)包圍,可以使用$Q$等等。
下表展示了不使用美元符界定的時(shí)候該如何寫單引號(hào)。把美元符引號(hào)之前的引號(hào)包圍的代碼轉(zhuǎn)換成某種可以理解的形式時(shí),應(yīng)該會(huì)用得上。
開始/結(jié)束函數(shù)體,比如:
CREATE FUNCTION foo() RETURNS integer AS ' .... ' LANGUAGE plpgsql;
在函數(shù)體內(nèi)部的任何位置,問號(hào)都必須成對(duì)出現(xiàn)
對(duì)于函數(shù)體內(nèi)的字符串文本,比如:
a_output := ''Blah''; SELECT * FROM users WHERE f_name=''foobar'';
在美元符界定的方法里,你只要寫
a_output := 'Blah'; SELECT * FROM users WHERE f_name='foobar';
兩種情況都是PL/pgSQL分析器期望看到的東西。
如果你在函數(shù)體中的字符串里面需要一個(gè)單引號(hào),比如:
a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''
a_output 的值將是 AND name LIKE 'foobar' AND xyz。
使用美元符界定的方法應(yīng)該這樣寫
a_output := a_output || $$ AND name LIKE 'foobar' AND xyz$$
注意,這樣的美元符界定的分隔符并不是只有$$。
如果一個(gè)在函數(shù)體中的字符串內(nèi)的單引號(hào)與該字符串常量結(jié)尾前后相連,比如:
a_output := a_output || '' AND name LIKE ''''foobar''''''
a_output的值將是 AND name LIKE 'foobar'
用美元符界定的方法則為是
a_output := a_output || $$ AND name LIKE 'foobar'$$
如果你想要在字符串常量里有兩個(gè)單引號(hào)(它們?cè)谝黄鹗?個(gè)了) ,并且這兩個(gè)單引號(hào)和該字符串常量的結(jié)尾相連(又加2個(gè))。 可能只有在寫一個(gè)生成其它函數(shù)的函數(shù)的時(shí)候,像Example 39-7里那樣。 For example: 比如:
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;
使用美元符界定的方法應(yīng)該這樣寫
a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$ || referrer_keys.key_string || $$' then return '$$ || referrer_keys.referrer_type || $$'; end if;$$;
假設(shè)我們只需要在a_output里放單引號(hào),因?yàn)樵谑褂们八鼤?huì)被重新引號(hào)包圍