Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/Python - linguaggio procedurale python > Funzioni PL/Python
PrecedentePL/Python - linguaggio procedurale pythonValori dei datiSuccessivo

42.2. Funzioni PL/Python

Le funzioni in PL/Python sono dichiarate attraverso la sintassi standard CREATE FUNCTION(7):

CREATE FUNCTION funcname (argument-list)
  RETURNS return-type
AS $$
  # PL/Python function body
$$ LANGUAGE plpythonu;

Il corpo di una funzione è semplicemente uno script Python. Quando la funzione viene chiamata, i suoi argomenti sono passati come elementi dell'elenco args; anche gli argomenti nominati sono passati come variabili ordinarie allo script Python. L'uso di argomenti nominati di solito è più leggibile. Il risultato è restituito dal codice Python nel solito modo, con return o yield (in caso di un'istruzione result-set). Se non si fornisce un valore di ritorno, Python ritorna come predefinto None. PL/Python traduce il None di Python nel valore SQL null.

Per esempio, una funzione che restituisce il maggiore di due interi può essere definita come:

CREATE FUNCTION pymax (a integer, b integer)
  RETURNS integer
AS $$
  if a > b:
    return a
  return b
$$ LANGUAGE plpythonu;

Il codice Python che è fornito come corpo della definizione della funzione viene trasformato in una funzione Python. L'esempio sopra risulta in:

def __plpython_procedure_pymax_23456():
  if a > b:
    return a
  return b

assumendo che 23456 sia l'OID assegnato alla funzione da PostgreSQL™.

Gli argomenti sono impostati come variabili globali. Considerate le regole di scope di Python, questo ha come conseguenza che una variabile argomento non può essere riassegnata all'interno della funzione al valore di un'espressione che coinvolge la variabile stessa, a meno che la variabile non sia ridichiarata come globale nel blocco. Per esempio, il codice seguente non funzionerà:

CREATE FUNCTION pystrip(x text)
  RETURNS text
AS $$
  x = x.strip()  # error
  return x
$$ LANGUAGE plpythonu;

dato che l'assegnamento a x rende x una variabile locale per l'intero blocco, e quindi la x a destra dell'assegnamento si riferisce a una variabile locale x non ancora assegnata, non al parametro della funzione PL/Python. Usando l'istruzione global, questo funzionerà:

CREATE FUNCTION pystrip(x text)
  RETURNS text
AS $$
  global x
  x = x.strip()  # ok now
  return x
$$ LANGUAGE plpythonu;

Ma non è consigliabile basarsi su questo dettaglio di implementazione di PL/Python. È meglio trattare i parametri della funzione come a sola lettura.

Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/Python - linguaggio procedurale python > Funzioni PL/Python
PrecedentePL/Python - linguaggio procedurale pythonValori dei datiSuccessivo