日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

plpythonu_PostgreSQL PL/Python 函数

發布時間:2025/3/15 python 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 plpythonu_PostgreSQL PL/Python 函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PL/Python 寫的函數用通常的 CREATE FUNCTION 語法聲明。比如:

CREATE FUNCTION funcname (argument-list)

RETURNS return-type

AS $$

# PL/Python function body

$$ LANGUAGE plpythonu;

函數體是一個簡單的 Python 腳本。當該函數被調用的時候,傳遞的參數將成為 args[] 數組的元素。命名參數也會被傳遞到腳本中并被當作普通變量。結果將使用 return 或 yield 照常返回。

例如,返回兩個整數中較大者的函數:

CREATE FUNCTION pymax (a integer, b integer)

RETURNS integer

AS $$

if a > b:

return a

return b

$$ LANGUAGE plpythonu;

以函數體形式給出的 Python 轉換成 Python 函數。比如,上面的轉換成

def __plpython_procedure_pymax_23456():

if a > b:

return a

return b

這里假設 23456 是 PostgreSQL 賦予這個函數的 OID 。

PostgreSQL 函數變量可以通過全局的 args 列表獲取。在 pymax 例子里,args[0] 包含第一個參數的數值。args[1] 包含第二個。除此在外,還可以使用上例中演示的已命名的參數,這種方法的可讀性更好。

如果向函數傳遞了一個 NULL 值,參數值將會顯示為 None 。上述函數定義將對 NULL 輸入產生錯誤的結果。我們可以通過添加 STRICT 來進行更合理的操作:如果傳入 NULL 值,函數將根本不會被調用,而是立即返回 NULL 。當然,也可以在函數體中檢查輸入參數是否為 NULL :

CREATE FUNCTION pymax (a integer, b integer)

RETURNS integer

AS $$

if (a is None) or (b is None):

return None

if a > b:

return a

return b

$$ LANGUAGE plpythonu;

如上所示,要從 PL/Python 函數中返回 NULL ,只要返回 None 即可。無論函數是否嚴格,這樣做都有效。

復合類型參數將作為 Python 映射進行傳遞。映射的元素名是組合類型的元素名。如果被傳遞的行中某個屬性值為 NULL ,它在映射中的值將是 None 。例如:

CREATE TABLE employee (

name text,

salary integer,

age integer

);

CREATE FUNCTION overpaid (e employee)

RETURNS boolean

AS $$

if e["salary"] > 200000:

return True

if (e["age"] < 30) and (e["salary"] > 100000):

return True

return False

$$ LANGUAGE plpythonu;

有多種從 Python 函數返回行或者復合類型的方法。下面的例子假定我們有:

CREATE TYPE named_value AS (

name text,

value integer

);

一個復合類型的結果可以作為下列之一被返回:

序列類型(一個元組或列表,但不是一個集合,因為集合不可以被索引)

返回的序列對象中的項數必須與結果的復合類型字段數相同。索引為 0 的項將被分配給組合類型的第一個字段,其它依此類推,比如:

CREATE FUNCTION make_pair (name text, value integer)

RETURNS named_value

AS $$

return [ name, value ]

# 或者作為元組返回( name, value )

$$ LANGUAGE plpythonu;

要為任何字段返回 NULL ,就在相應的位置插入 None 。

映射(字典)

每個結果類型字段的值都重新從映射中使用字段名作為鍵檢索。例如:

CREATE FUNCTION make_pair (name text, value integer)

RETURNS named_value

AS $$

return { "name": name, "value": value }

$$ LANGUAGE plpythonu;

任何額外的字典鍵/值對都將被忽略。丟失的鍵將被當作錯誤。要為任何字段返回 NULL ,就以相應的字段名作為鍵插入 None 。

對象(任何提供 __getattr__ 方法的對象)

它的工作方式和映射一樣。例如:

CREATE FUNCTION make_pair (name text, value integer)

RETURNS named_value

AS $$

class named_value:

def __init__ (self, n, v):

self.name = n

self.value = v

return named_value(name, value)

# 或者簡單地

class nv: pass

nv.name = name

nv.value = value

return nv

$$ LANGUAGE plpythonu;

如果沒有提供返回值,Python 將返回缺省的 None 。PL/Python 將把 None 翻譯成 NULL 。

一個 PL/Python 函數還可以返回標量或組合類型的集合。有多種方法可以達到這個目的,因為返回的對象在內部被轉換成一個迭代器。下面的例子假定我們有一個復合類型:

CREATE TYPE greeting AS (

how text,

who text

);

一個集合結果可以從下列之一返回:

序列類型(元組、列表、集合)

CREATE FUNCTION greet (how text)

RETURNS SETOF greeting

AS $$

# 返回包含作為符合類型列表的元組

# 所有其它組合也都可以

return ( [ how, "World" ], [ how, "PostgreSQL" ], [ how, "PL/Python" ] )

$$ LANGUAGE plpythonu;

迭代器(任何提供 __iter__ 和 next 方法的對象)

CREATE FUNCTION greet (how text)

RETURNS SETOF greeting

AS $$

class producer:

def __init__ (self, how, who):

self.how = how

self.who = who

self.ndx = -1

def __iter__ (self):

return self

def next (self):

self.ndx += 1

if self.ndx == len(self.who):

raise StopIteration

return ( self.how, self.who[self.ndx] )

return producer(how, [ "World", "PostgreSQL", "PL/Python" ])

$$ LANGUAGE plpythonu;

生成器(yield)

CREATE FUNCTION greet (how text)

RETURNS SETOF greeting

AS $$

for who in [ "World", "PostgreSQL", "PL/Python" ]:

yield ( how, who )

$$ LANGUAGE plpythonu;

警告

當前,由于 Python bug #1483133 的原因,一些 Python 2.4 的調試版本(使用 --with-pydebug 選項編譯)已知會讓 PostgreSQL 服務器在使用迭代器返回集合時崩潰。原始的 Fedora 4 仍然包含這個臭蟲,但是在生產版本的 Python 或已經修補的 Fedora 4 上沒有這個問題。

全局字典 SD 可以用于在函數調用中間存儲數據。這個變量是私有靜態數據。全局字典 SD 是公共數據,可以在一個后端里的所有 Python 函數之間使用。但在使用時需要小心。

每個函數都在 Python 解釋器里獲得自己的受限制的執行對象,因此來自 myfunc 的全局數據很函數參數是 myfunc2 所看不到的。這里的例外是上面提到的 SD 字典。

總結

以上是生活随笔為你收集整理的plpythonu_PostgreSQL PL/Python 函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。