---
order: 18
navTitle: 存储过程
---
# 加工组件：存储过程

通常使用数据加工处理数据不需要使用存储过程，但如果数据库中已经有存储过程了，数据加工支持通过SQL组件调用存储过程。

示例地址：[调用存储过程](https://demo.succbi.com/v5/DEMO/data?:open=UMERuvWbQBNqgFzrKasP5F)

::: details 点击查看如何创建存储过程

可在SQL查询（参考文档：[SQL查询](../../data-gov/sql-model.md)）中执行存储过程定义语句来创建存储过程，语法如下：

```sql
-- 以MySQL数据库语法为例
create procedure 过程名称(参数)
BEGIN
  过程体
END
```

在MySQL数据源中新建SQL查询窗口，输入存储过程定义语句并执行，如下：
![创建存储过程](./images/2020-06-16-16-30-22.png)

::: tip 提示

1. 使用`drop procedure 过程名`删除存储过程
2. 使用`delimiter`来定义语句的结束符

:::

## 在加工中调用存储过程{#call-procedure}

在数据加工中可添加一个SQL组件节点，在SQL组件中使用`call`命令调用存储过程。\
![添加SQL组件](./images/2020-06-16-19-11-08.png)

### 调用方法{#call-method}

`call 存储过程名(参数)`

### 调用示例{#call-examples}

示例存储过程`p_quality_customers`定义如下：

```sql
-- 三个参数在过程体中设置了默认值
CREATE PROCEDURE `p_quality_customers`( 
      IN min_monthly_purchases int
    , IN min_dollar_amount_purchased DECIMAL(10,2) 
    , IN tjyf VARCHAR(6) 
) 
```

- 不带参数调用\
  `call p_quality_customers()`

- 带参数调用\
  `call p_quality_customers(3,30,'200508')`

:::tip 提示
一般数据库的存储过程参数类型分为IN（输入）、OUT（输出）、INOUT（输入输出），目前数据加工中调用时只支持IN参数。
:::

## 将存储过程的输出表作为模型输出{#output-table}

在数据管理中，数据加工与物理表一般是一对一的关系，且每个数据加工必须以模型输出节点作为流程图结束的节点，在模型输出节点来指定目标物理表。

在调用存储过程处理数据的场景下，情况有所不同，目标物理表在存储过程中已经处理好了，只需要将存储过程的输出表（表名为FACT\_DVD\_VIP\_CUST）设置为模型输出。

### 设置步骤{#setting-steps}

1. 在调用存储过程的**SQL节点**后添加**物理表**节点
   ![添加物理表](./images/2020-06-16-17-47-03.png)
2. **物理表**节点中指定物理表为存储过程的输出表（`FACT_DVD_VIP_CUST`）
   ![选择物理表](./images/2020-06-16-17-48-25.png)
3. **物理表**节点后添加**模型输出**，模型输出的提取数据设置为**使用上游节点的表**
   ![使用上游节点的表](./images/2020-06-16-17-48-49.png)

## 管理存储过程的血统{#mgr-pedigree}

存储过程加工模型的逻辑位于产品环境外部（数据库服务器中），此时数据加工不能自动解析出输出表的血统关系，只能通过手工编辑字段的`取数公式`或`取数条件`来管理模型的血统。

### 操作步骤{#mgr-pedigree-steps}

1. 在模型输出的字段列表上编辑取数公式\
   ![编辑取数公式](./images/2020-06-17-09-28-59.png)
2. 取数公式的表达式对话框中添加引用表\
   引入存储过程加工中使用到的模型
   ![添加引用表](./images/2020-06-17-09-32-04.png)
3. 输入取数口径表达式
   ![取数口径](./images/2020-06-16-19-29-21.png)
