# CREATE FUNCTION

{% hint style="info" %}
**Note** Only valid for approved organizations. Please [contact us to enable functions](https://console.deltastream.io/support-center).
{% endhint %}

## Syntax <a href="#synopsis" id="synopsis"></a>

```sql
CREATE FUNCTION
    function_name (arg_name arg_type [, ...])
    RETURNS return_type
    LANGUAGE language_name
WITH (function_parameter = value [, ...]);
```

## Description

Defines a new [user-defined function](https://docs.deltastream.io/overview/core-concepts/function) (UDF), an executable routine defined in a supported language, which accepts an ordered list of input arguments, performs a computation, and generates a result value.

The name and parameter types of a function’s signature must be unique within an organization. The signature is a combination of the name, parameter types, and return type of the function.

See the [Creating a Function](https://docs.deltastream.io/how-do-i.../creating-a-function) tutorial for a full example of adding a [function](https://docs.deltastream.io/overview/core-concepts/function).

### Arguments

#### function\_name

Name of the function to create. If the name is case sensitive you must wrap it in double quotes; otherwise the system uses the lower case name.

#### (arg\_name arg\_type \[,…​])

An ordered list of function argument names and types.

#### return\_type

Data type for a function’s result value.

#### language\_name

Language in which the function was created. Supports `JAVA`.

#### WITH (function\_parameter = value \[, …​ ])

This clause specifies the [function parameters](#function-parameters).

### Function Parameters

| Parameter Name      | Description                                                                                                                                                                                                                                                                                                                                                          |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `source.name`       | <p>Required. Specifies an existing function Source to use for the content of the function. See <a data-mention href="../command/list-function_sources">list-function\_sources</a>.<br><br>Type: String<br>Valid values: A function\_source to which the user has access. See <a data-mention href="../command/list-function_sources">list-function\_sources</a>.</p> |
| `class.name`        | <p>Required. Specifies the fully-qualified class name defined within a function source.<br><br>Type: String<br>Valid values: A valid class name in the function\_source.</p>                                                                                                                                                                                         |
| `egress.allow.uris` | Optional. Specifies a comma delimited list of `host:port` endpoints that the `function` can send requests. This is only needed if a function needs to call a remote service.                                                                                                                                                                                         |

### Example

#### Create user-defined function with single input argument

The below DDL statement creates a new user-defined function with the name `toUpperCase`. The function accepts one argument of the data type `VARCHAR;` the data type of its return value is also `VARCHAR`. The function's executable code is in a Java class with the name `util.UpperCase` available in the `mysrc` function source. Check [CREATE FUNCTION SOURCE](https://docs.deltastream.io/reference/sql-syntax/ddl/create-function_source) for details on how to add a function source.

```sql
CREATE FUNCTION
    "toUpperCase" (s VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVA
    WITH ( 'source.name' = 'mysrc', 'class.name' = 'util.UpperCase' );
```

You can use [list-functions](https://docs.deltastream.io/reference/sql-syntax/command/list-functions "mention") command to get a list of created functions.

#### Create user-defined function with multiple input arguments

The below DDL statement creates a new user-defined function called `getrate` from a Java class with the name `accounting.Exchange` available in the `finance` function source. This function receives two input arguments of data types `VARCHAR` and `BIGINT`, and generates an output of the data type `DECIMAL`.

```sql
CREATE FUNCTION
    getrate (name VARCHAR, amount BIGINT)
    RETURNS DECIMAL
    LANGUAGE JAVA
    WITH ( 'source.name' = 'finance', 'class.name' = 'accounting.Exchange' );
```

#### Create user-defined function with egress.allow\.uris property

The below DDL statement creates a new user-defined function called `getrate` from a Java class with the name `accounting.Exchange` available in the `finance` function source. This function receives two input arguments of data types `VARCHAR` and `BIGINT`, and generates an output of the data type `DECIMAL`.

This function will can also make remote calls to `myhost1:9090` and `myhost2:80`. Without the `egress.allow.uris` property, the function calls are blocked.

```sql
CREATE FUNCTION
    getrate (name VARCHAR, amount BIGINT)
    RETURNS DECIMAL
    LANGUAGE JAVA
    WITH ( 'source.name' = 'finance', 'class.name' = 'accounting.Exchange', 'egress.allow.uris'='myhost1:9090,myhost2:80' );
```
