---
title: "CREATE FUNCTION - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: CREATE FUNCTION 描述 CREATE FUNCTION 语句用于创建或替换独立函数或调用规范。独立函数是指存储在数据库中的函数（返回单个值的子程序）。 功能适用性 该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。 注意 使用 CREATE FU…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# CREATE FUNCTION

更新时间：2026-03-29 18:26:15

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/600.pl-reference/300.pl-oracle/1100.ddl-operations-on-stored-pl-units-oracle/700.create-function-oracle.md)  

## 描述

`CREATE FUNCTION` 语句用于创建或替换独立函数或调用规范。独立函数是指存储在数据库中的函数（返回单个值的子程序）。

#### 功能适用性

该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。

#### 注意

使用 `CREATE FUNCTION` 语句创建的独立函数不同于在 PL 块或包中声明和定义的函数。

## 前提条件

要在 Schema 中创建或替换独立函数，必须具有 `CREATE FUNCTION` 的系统权限。要在另一个用户的 Schema 中创建或替换独立函数，则必须具有 `CREATE ANY FUNCTION` 的系统权限。

## 语法

`create_function` 的语法如下：

```sql
CREATE [ OR REPLACE ]
FUNCTION plsql_function_source

```

其中，`plsql_function_source` 的语法如下：

```sql
[ schema. ] function_name
  [ ( parameter_declaration [, parameter_declaration]... ) ]
  RETURN datatype [ sharing_clause ]
  [ invoker_rights_clause
    | accessible_by_clause
    | DETERMINISTIC
    | parallel_enable_clause
    | result_cache_clause
    | default_collation_clause
    | pipelined_clause
    ]...
  { { AGGREGATE | PIPELINED }  USING [ schema. ] implementation_type
  | [ PIPELINED ] { IS | AS } { [ declare_section ] body
                              | call_spec
                              }
  } ;

```

## 语义

| 语法 | 关键字或语法节点 | 说明 |
| --- | --- | --- |
| create_function | OR REPLACE | 重新创建该函数（如果存在），然后重新编译。在重新定义函数之前被授予该函数权限的用户仍然可以访问该函数而无需重新获得权限。如果有任何基于函数的索引依赖于该函数，则数据库会将索引标记为 `DISABLED`。 |
| plsql_function_source | schema | 该函数所在的 Schema 名称。默认值为当前用户的 Schema。 |
| plsql_function_source | function_name | 要创建的函数名称。 |
| plsql_function_source | RETURN datatype | 对于数据类型，请指定函数返回值的数据类型。返回值可以为 PL 所支持的任何数据类型。 |
| plsql_function_source | body | 函数所必需的可执行部分，以及函数的异常处理部分（可选）。 |
| plsql_function_source | declare_section | 函数的可选声明部分。声明对于函数来说是局部的，可以在 `body` 中引用，在函数完成执行后不再存在。 |
| plsql_function_source | DETERMINISTIC | 表示该函数是确定性的，即对于相同的输入参数总是返回相同的结果。这对于优化查询性能很重要。 |
| plsql_function_source | parallel_enable_clause | 表示该函数可以在并行查询中安全执行。当指定此特性时，函数必须满足确定性、不修改数据库状态、不依赖会话状态等条件。 |

## 示例

创建函数 `get_salary_by_dept`。

```sql
CREATE OR REPLACE FUNCTION get_salary_by_dept(
       v_in_dept_id NUMBER,
       v_out_emp_count OUT NUMBER)
       RETURN NUMBER
   IS
       v_sum NUMBER;
   BEGIN
       SELECT SUM(salary), count(*) INTO v_sum, v_out_emp_count
           FROM employees WHERE deptno=v_in_dept_id;
       RETURN v_sum;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         DBMS_OUTPUT.PUT_LINE('Dept id '||v_in_dept_id||' not found');
      WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('ERR: '||SQLCODE||': '||SQLERRM);
   END get_salary_by_dept;
/

```

创建可以在并行查询中安全执行的函数。

```sql
CREATE OR REPLACE FUNCTION sub_query_result(input VARCHAR)
DETERMINISTIC
PARALLEL_ENABLE
RETURN VARCHAR
IS
    result tp_sys_para.para_value%type;
BEGIN
    SELECT tp.para_value INTO result
    FROM tp_sys_para tp
    WHERE tp.para_name_e = input;
    RETURN result;
END;
/

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
