

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# `CREATE FUNCTION`
<a name="create-function-syntax-support"></a>

`CREATE FUNCTION`definisce una nuova funzione.

**Importante**  
In Amazon Aurora DSQL, supporta `CREATE FUNCTION` solo SQL-language le funzioni (). `LANGUAGE sql` 

## Sintassi supportata
<a name="create-function-supported-syntax"></a>

```
CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE sql
    | { IMMUTABLE | STABLE | VOLATILE }
    | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
    | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | RETURN expression
    | BEGIN ATOMIC statement; [ statement; ... ] END
  } ...

where LANGUAGE must be sql
```

## Description
<a name="create-function-description"></a>

`CREATE FUNCTION`definisce una nuova funzione. `CREATE OR REPLACE FUNCTION`creerà una nuova funzione o sostituirà una definizione esistente. Per poter definire una funzione, è necessario disporre del `USAGE` privilegio sulla lingua.

Se è incluso un nome di schema, la funzione viene creata nello schema specificato. Altrimenti, la funzione viene creata nello schema corrente. Il nome della nuova funzione non deve corrispondere a nessuna funzione esistente con gli stessi tipi di argomenti di input nello stesso schema. Tuttavia, le funzioni con diversi tipi di argomento possono condividere un nome (questo è chiamato *sovraccarico*).

Per sostituire la definizione corrente di una funzione esistente, usa`CREATE OR REPLACE FUNCTION`. Non è possibile modificare il nome o i tipi di argomento di una funzione in questo modo (ciò creerebbe effettivamente una nuova funzione distinta). Inoltre, non è possibile utilizzare `CREATE OR REPLACE FUNCTION` per modificare il tipo di ritorno di una funzione esistente. Per fare ciò, è necessario eliminare e ricreare la funzione.

Quando `CREATE OR REPLACE FUNCTION` viene utilizzato per sostituire una funzione esistente, la proprietà e le autorizzazioni della funzione non cambiano. A tutte le altre proprietà della funzione vengono assegnati i valori specificati o impliciti nel comando. È necessario possedere la funzione per sostituirla (ciò include essere un membro del ruolo proprietario). 

Se si elimina e poi si ricrea una funzione, la nuova funzione non è la stessa entità della precedente; sarà necessario eliminare le regole, le visualizzazioni e così via esistenti che si riferiscono alla vecchia funzione. Si usa `CREATE OR REPLACE FUNCTION` per modificare la definizione di una funzione senza rompere gli oggetti che si riferiscono alla funzione. 

Diventi il proprietario di una funzione che hai creato.

Per poter creare una funzione, è necessario disporre dei `USAGE` privilegi sui tipi di argomento e sul tipo restituito.

Una `SQL` funzione racchiude una o più `SQL` istruzioni in un'unità riutilizzabile e richiamabile. Utilizza le funzioni per centralizzare espressioni o calcoli comuni, applicare una logica coerente su più query e semplificare il codice dell'applicazione richiamando una singola funzione anziché ripetere la stessa. `SQL` 

## Parameters
<a name="create-function-parameters"></a>

**{{name}}**  
Il nome (facoltativamente qualificato dallo schema) della funzione da creare.

**{{argmode}}**  
La modalità di un argomento:`IN`,`OUT`, `INOUT` o. `VARIADIC` Se omesso, il valore predefinito è`IN`. `VARIADIC`deve essere l'ultimo parametro di input; solo `OUT` gli argomenti possono seguirlo. `OUT`e `INOUT` gli argomenti non possono essere combinati con la `RETURNS TABLE` notazione.

**{{argname}}**  
Il nome di un argomento. In una funzione SQL, è possibile fare riferimento a un argomento per nome nel corpo della funzione. Anche il nome di un `INOUT` argomento `OUT` or è significativo, poiché definisce il nome della colonna corrispondente nel tipo di riga dei risultati.

**{{argtype}}**  
Il tipo di dati di un argomento. Può trattarsi di qualsiasi tipo di DSQL-supported base, tipo di array o dominio Aurora. Per ulteriori informazioni, consulta [Tipi di dati supportati in Aurora DSQL](working-with-postgresql-compatibility-supported-data-types.md). È inoltre possibile fare riferimento al tipo di una colonna di tabella esistente utilizzando la `%TYPE` notazione.

**{{default\_expr}}**  
Un'espressione da utilizzare come valore predefinito se l'argomento non è specificato. L'espressione deve essere coercibile al tipo di argomento del parametro. Solo `IN` gli `INOUT` argomenti possono avere un valore predefinito. Ogni argomento dopo uno con un valore predefinito deve avere anche un valore predefinito.

**{{rettype}}**  
Il tipo di dati restituito. Può trattarsi di qualsiasi tipo di DSQL-supported base, tipo di array o dominio Aurora. Per ulteriori informazioni, consulta [Tipi di dati supportati in Aurora DSQL](working-with-postgresql-compatibility-supported-data-types.md). Per restituire un set di righe, usa `SETOF {{rettype}}` o`RETURNS TABLE`. Se non si prevede che la funzione restituisca un valore, `void` specificalo come tipo restituito. Se sono presenti `INOUT` parametri `OUT` o, la `RETURNS` clausola può essere omessa e la funzione restituisce uno `record` o il tipo di riga corrispondente.

**`RETURNS TABLE ( {{column_name}} {{column_type}} [, ...] )`**  
Speciifica che la funzione restituisce un set di righe con le colonne denominate e i relativi tipi. Ciò equivale a dichiarare uno o più `OUT` parametri e specificarlo `SETOF` come tipo restituito.

**`LANGUAGE sql`**  
Il linguaggio usato per implementare la funzione. In Aurora DSQL, deve essere così. `sql` Se si omette la `LANGUAGE` clausola e si fornisce un `RETURN` corpo `BEGIN ATOMIC` o, si presume. `sql` Una stringa costante body (`AS '{{definition}}'`) richiede una `LANGUAGE sql` clausola esplicita; la sua omissione fallisce con l'errore. `no language specified`

**`IMMUTABLE` / `STABLE` / `VOLATILE`**  
Questi attributi informano l'ottimizzatore di query sul comportamento della funzione. È possibile specificarne al massimo uno. Se li ometti tutti e tre, la funzione viene impostata per impostazione predefinita su. `VOLATILE`  
+ `IMMUTABLE`indica che la funzione non può modificare il database e restituisce sempre lo stesso risultato quando vengono assegnati gli stessi valori di argomento.
+ `STABLE`indica che la funzione non può modificare il database. All'interno di una singola scansione della tabella, restituisce costantemente lo stesso risultato per gli stessi valori degli argomenti, ma il risultato potrebbe cambiare tra le istruzioni SQL.
+ `VOLATILE`indica che il valore della funzione può cambiare anche all'interno di una singola scansione della tabella, quindi non è possibile effettuare ottimizzazioni.

**`CALLED ON NULL INPUT` / `RETURNS NULL ON NULL INPUT` / `STRICT`**  
`CALLED ON NULL INPUT`(impostazione predefinita) indica che la funzione viene chiamata normalmente quando alcuni dei suoi argomenti sono nulli. `RETURNS NULL ON NULL INPUT`o `STRICT` indica che la funzione restituisce sempre null quando uno qualsiasi dei suoi argomenti è nullo. Se specificato, Aurora DSQL non esegue la funzione quando un argomento è nullo; invece, la funzione restituisce automaticamente null. 

**`[ EXTERNAL ] SECURITY INVOKER` / `[ EXTERNAL ] SECURITY DEFINER`**  
`SECURITY INVOKER`(impostazione predefinita) indica che la funzione deve essere eseguita con i privilegi dell'utente che la chiama. `SECURITY DEFINER`specifica che la funzione deve essere eseguita con i privilegi dell'utente che la possiede. La parola chiave `EXTERNAL` è consentita per la conformità a SQL, ma è facoltativa.

**`PARALLEL { UNSAFE | RESTRICTED | SAFE }`**  
Aurora DSQL accetta e archivia la marcatura. `PARALLEL` Tuttavia, questa marcatura non influisce sull'esecuzione delle query. 

**`COST {{execution_cost}}`**  
Un numero positivo che indica il costo di esecuzione stimato per la funzione. Se la funzione restituisce un set, questo valore è il costo stimato per riga restituita. Il pianificatore di query utilizza questa stima quando non include la funzione.

**`ROWS {{result_rows}}`**  
Un numero positivo che indica il numero stimato di righe che il pianificatore di query dovrebbe aspettarsi che la funzione restituisca. Ciò è consentito solo quando si dichiara che la funzione restituisce un set. Il presupposto predefinito è 1000 righe.

**`SET {{configuration_parameter}} { TO {{value}} | = {{value}} | FROM CURRENT }`**  
La `SET` clausola fa sì che il parametro di configurazione specificato venga impostato sul valore specificato quando viene immessa la funzione e quindi ripristinato al valore precedente quando la funzione viene chiusa. `SET FROM CURRENT`salva il valore del parametro che è corrente quando `CREATE FUNCTION` viene eseguito come valore da applicare quando viene immessa la funzione.

**`AS '{{definition}}'`**  
Una costante di stringa che definisce la funzione; il significato dipende dalla lingua. Per una SQL-language funzione, sono le istruzioni SQL che costituiscono il corpo della funzione.

**`RETURN {{expression}}`**  
Definisce il corpo della funzione utilizzando la SQL-standard sintassi di una funzione che restituisce una singola espressione. Si tratta di un'alternativa alla forma a stringa costante.

**`BEGIN ATOMIC {{statement}}; [ ... ] END`**  
Definisce il corpo della funzione utilizzando la SQL-standard sintassi. Il corpo è costituito da una o più istruzioni SQL. Questo modulo è valido solo per`LANGUAGE sql`. Le istruzioni in un corpo atomico vengono tracciate come dipendenze della funzione. Ad esempio, una tabella a cui si fa riferimento nel corpo non può essere eliminata senza eliminare anche la funzione o utilizzarla. `DROP ... CASCADE`

## Note
<a name="create-function-notes"></a>

Utilizzate l'`DROP FUNCTION`istruzione per rimuovere una funzione. È inoltre possibile concedere e revocare i privilegi su una funzione con `GRANT` and `REVOKE` (ad esempio,). `REVOKE ALL ON FUNCTION`

Qualsiasi funzione che legge o modifica i dati nelle tabelle è soggetta allo stesso comportamento di transazione e concorrenza delle istruzioni SQL equivalenti eseguite direttamente. Le funzioni dichiarate `IMMUTABLE` o non `STABLE` devono modificare il database.

Per aggiornare la definizione di una funzione esistente, utilizzare`CREATE OR REPLACE FUNCTION`. Non è possibile modificare i tipi di argomento o restituire il tipo di funzione in questo modo; è invece possibile eliminare e ricreare la funzione.

Per rinominare una funzione, cambiarne il proprietario o spostarla in un altro schema, usa. `ALTER FUNCTION` Per modificare qualsiasi altro attributo, utilizzatelo `CREATE OR REPLACE FUNCTION` con le modifiche desiderate. Per ulteriori informazioni, consulta [`ALTER FUNCTION`](alter-function-syntax-support.md).

È supportato il sovraccarico delle funzioni: è possibile definire diverse funzioni con lo stesso nome purché i tipi di argomenti di input siano diversi. Una funzione definita dall'utente può anche richiamare altre funzioni e oscurare una funzione incorporata con lo stesso nome e lo stesso tipo di argomento.

Per una funzione che restituisce un set (`SETOF`o`RETURNS TABLE`) il cui corpo contiene più di un'istruzione, viene restituito solo il risultato dell'istruzione finale. La funzione esegue ancora le istruzioni precedenti, ma ne scarta i risultati. Questo è il comportamento standard per SQL-language le funzioni. Strutturate la funzione in modo che la sua dichiarazione finale produca il set completo di risultati.

Una funzione di restituzione dei set non garantisce alcun ordine di riga particolare. Per controllare l'ordine delle righe, includete una `ORDER BY` clausola nella query.

## Considerazioni
<a name="create-function-considerations"></a>

Le seguenti `CREATE FUNCTION` funzionalità restituiscono l'errore mostrato.

**`LEAKPROOF`**  
Restituisce l'errore`only superuser can define a leakproof function`. `NOT LEAKPROOF`(impostazione predefinita) è accettata.

**`TRANSFORM FOR TYPE`**  
Restituisce l'errore`transform for type {{type}} language "sql" does not exist`.

**`SUPPORT`(funzione di supporto del pianificatore)**  
Restituisce l'errore`function {{name}}(internal) does not exist`.

**User-defined tipi compositi (`CREATE TYPE ... AS`), incluse le funzioni che restituiscono un tipo composito**  
Restituisce l'errore`unsupported statement: CompositeType`.

Aurora DSQL non supporta`CREATE PROCEDURE`, il che fallisce con l'errore. `PROCEDURE is not supported`

L'`WINDOW`attributo è accettato sintatticamente ma non è utile per le funzioni. SQL-language Evita di usare questo attributo.

## Esempi
<a name="create-function-examples"></a>

Crea una semplice funzione SQL che aggiunge due numeri interi, utilizzando un corpo di stringa costante:

```
CREATE FUNCTION add(integer, integer) RETURNS integer
    AS 'SELECT $1 + $2;'
    LANGUAGE sql
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;
```

Crea la stessa funzione usando il SQL-standard `RETURN` corpo e gli argomenti denominati:

```
CREATE FUNCTION add(a integer, b integer) RETURNS integer
    LANGUAGE sql
    IMMUTABLE
    RETURN a + b;
```

Crea una funzione che restituisca un insieme di righe utilizzando `RETURNS TABLE` e un `BEGIN ATOMIC` corpo:

```
CREATE FUNCTION employees_in_dept(dept_id integer)
    RETURNS TABLE (id integer, name text)
    LANGUAGE sql
    STABLE
    BEGIN ATOMIC
        SELECT id, name FROM employees WHERE department_id = dept_id;
    END;
```

Crea una funzione che funzioni con i privilegi del proprietario e imposta un parametro di configurazione per la durata della chiamata:

```
CREATE FUNCTION current_department() RETURNS text
    LANGUAGE sql
    STABLE
    SECURITY DEFINER
    SET search_path = app
    AS 'SELECT current_setting(''app.department'');';
```

## Compatibilità
<a name="create-function-compatibility"></a>

Un `CREATE FUNCTION` comando è definito nello standard SQL. L'implementazione di PostgreSQL può essere utilizzata in modo compatibile ma ha molte estensioni. Al contrario, lo standard SQL specifica una serie di funzionalità opzionali che non sono implementate in PostgreSQL.

Di seguito sono riportati importanti problemi di compatibilità:
+ `OR REPLACE`è un'estensione PostgreSQL.
+ Per compatibilità con altri sistemi di database, {{argmode}} può essere scritto prima o dopo. {{argname}} Ma solo il primo metodo è conforme agli standard.
+ Per i parametri predefiniti, lo standard SQL specifica solo la sintassi con la parola chiave. `DEFAULT` La sintassi with `=` è usata in and Firebird. T-SQL 
+ Il `SETOF` modificatore è un'estensione PostgreSQL.
+ Solo SQL è standardizzato come linguaggio.
+ Tutti gli altri attributi tranne `CALLED ON NULL INPUT` e non `RETURNS NULL ON NULL INPUT` sono standardizzati.
+ Per il corpo delle `LANGUAGE sql` funzioni, lo standard SQL specifica solo il {{sql\_body}} modulo.

`LANGUAGE sql`Le funzioni semplici possono essere scritte in modo conforme agli standard e portabile ad altre implementazioni. Le funzioni più complesse che utilizzano funzionalità avanzate, attributi di ottimizzazione o altri linguaggi saranno necessariamente specifiche di PostgreSQL in modo significativo.