跳到主要内容

CREATE PROCEDURE

Introduced or updated: v1.2.816

定义一个执行 SQL 操作并返回结果的存储过程(Stored Procedure)。

语法

CREATE PROCEDURE <procedure_name>(<parameter_name> <data_type>, ...)
RETURNS <return_data_type> [NOT NULL]
LANGUAGE <language>
[ COMMENT '<comment>' ]
AS $$
BEGIN
<procedure_body>
RETURN <return_value>; -- 用于返回单个值
-- OR
RETURN TABLE(<select_query>); -- 用于返回一个表
END;
$$;
参数描述
<procedure_name>存储过程的名称。
<parameter_name> <data_type>输入参数(可选),每个参数都指定了数据类型。可以定义多个参数,用逗号分隔。
RETURNS <return_data_type> [NOT NULL]指定返回值的数据类型。NOT NULL 确保返回值不为 NULL。
LANGUAGE指定编写存储过程主体的语言。目前仅支持 SQL
COMMENT描述存储过程的可选文本。
AS ...包含存储过程的主体,其中包含 SQL 语句、变量声明、循环和 RETURN 语句。

访问控制要求

权限对象类型描述
CREATE PROCEDUREGlobal创建存储过程。

要创建存储过程,执行操作的用户或 current_role 必须拥有 CREATE PROCEDURE privilege

示例

此示例定义了一个将重量从千克(kg)转换为磅(lb)的存储过程:

CREATE PROCEDURE convert_kg_to_lb(kg DECIMAL(4, 2))
RETURNS DECIMAL(10, 2)
LANGUAGE SQL
COMMENT = '将千克转换为磅'
AS $$
BEGIN
RETURN kg * 2.20462;
END;
$$;

您还可以定义一个使用循环、条件和动态变量的存储过程。


CREATE OR REPLACE PROCEDURE loop_test()
RETURNS INT
LANGUAGE SQL
COMMENT = '循环测试'
AS $$
BEGIN
LET x RESULTSET := select number n from numbers(10);
LET sum := 0;
FOR x IN x DO
FOR batch in 0 TO x.n DO
IF batch % 2 = 0 THEN
sum := sum + batch;
ELSE
sum := sum - batch;
END IF;
END FOR;
END FOR;
RETURN sum;
END;
$$;

-- 授予角色 test ACCESS PROCEDURE 权限
GRANT ACCESS PROCEDURE ON PROCEDURE loop_test() to role test;

CALL PROCEDURE loop_test();

┌─Result─┐
-5
└────────┘
欢迎体验 Databend Cloud

基于 Rust + 对象存储构建的新一代多模态数仓,一个平台即可进行 BI、向量、全文检索及地理空间分析。

支持标准 SQL,自动弹性伸缩,助您快速构建现代化数据平台。

注册即领 ¥200 代金券。

注册体验