---
layout: global
title: DECLARE VARIABLE
displayTitle: DECLARE VARIABLE
license: |
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
 
     http://www.apache.org/licenses/LICENSE-2.0
 
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
---

### Description

The `DECLARE VARIABLE` statement is used to create a temporary variable in Spark.
Temporary variables are scoped at a session level.

You can reference variables by their name everywhere constant expressions are allowed.
Unless you qualify a variable with `session` or `system.session`, a variable is only resolved after
Spark fails to resolve a name to a column or column alias.

Temporary variables cannot be referenced in persisted objects such as persisted view,
column default expressions, and generated column expressions.

### Syntax

```sql
DECLARE [ OR REPLACE ] [ VARIABLE ]
    variable_name [ data_type ] [ { DEFAULT | = } default_expr ]
```

### Parameters

* **OR REPLACE**

    If specified, a pre-existing temporary variable is replaced if it exists.

* **variable_name**

    Specifies a name for the variable to be created.
    The variable name may be optionally qualified with a `system`.`session` or `session`.

    **Syntax:** `[ system . [ session .] ] variable_name`

* **data_type**

    Optionally defines the data type of the variable.
    If it is not specified the type is derived from the default expression.

* **default_expr**

    An optional expression used to initialize the value of the variable after declaration.
    The expression is re-evaluated whenever the variable is reset to `DEFAULT` using
    [SET VAR](sql-ref-syntax-aux-set-var.html).
    If `data_type` is specified `default_expr` must be castable to the variable type.
    If `data_type` is not specified you must specify a default and its type will become the type of
    the variable.
    If no default expression is given, the variable is initialized with `NULL`.

### Examples

```sql
-- The dense form of declaring a variable with default
DECLARE five = 5;

-- STRING variable initialialized to `NULL`
DECLARE some_var STRING;
```

### Related Statements

* [DROP TEMPORARY VARIABLE](sql-ref-syntax-ddl-drop-variable.html)
* [SET VARIABLE](sql-ref-syntax-aux-set-var.html)
