APEX:将经典报表区域作为邮件附件发送
Oracle APEXPL/SQL数据导出经典报表邮件附件
原文地址: https://synuora.hashnode.dev/apex-emailing-classic-report-region-as-an-attachment
# APEX:将经典报表区域作为邮件附件发送

## 背景
在内部讨论中,我被要求排查邮件发送失败的原因,同时用户提出需求:"如何将当前看到的报表结果通过邮件发送给他人?"。交互式报表和网格可以通过内置功能实现,但经典报表需要额外开发。
## 实现步骤
### 创建经典报表区域
1. 为报表区域设置静态ID:`emp_region`

### 添加操作按钮
添加按钮和动态动作,点击时执行服务器端PL/SQL代码:

### 关键API说明
1. `APEX_REGION.EXPORT_DATA` - 导出区域数据
2. `APEX_DATA_EXPORT` 数据类型 - 定义导出格式常量
3. `APEX_MAIL.ADD_ATTACHMENT` - 添加邮件附件
```sql
DECLARE
l_export apex_data_export.t_export;
l_region_id number;
l_email_id number;
BEGIN
SELECT region_id into l_region_id
FROM apex_application_page_regions
WHERE application_id = :APP_ID
and page_id = :APP_PAGE_ID
and static_id = 'emp_region';
l_export := apex_region.export_data (
p_format => apex_data_export.c_format_xlsx,
p_page_id => :APP_PAGE_ID,
p_region_id => l_region_id );
```
### 完整实现代码
```sql
DECLARE
l_export apex_data_export.t_export;
l_region_id number;
l_email_id number;
BEGIN
SELECT region_id into l_region_id
FROM apex_application_page_regions
WHERE application_id = :APP_ID
and page_id = :APP_PAGE_ID
and static_id = 'emp_region';
l_export := apex_region.export_data (
p_format => apex_data_export.c_format_xlsx,
p_page_id => :APP_PAGE_ID,
p_region_id => l_region_id );
l_email_id := apex_mail.send(
p_to => 'sydney.nurse@oracle.com',
p_from => 'no_reply@appsamples.apex',
p_subj => 'Employee Search Export',
p_body => 'See Attachment'
);
apex_mail.add_attachment(
p_mail_id => l_email_id,
p_attachment => l_export.content_blob,
p_filename => 'Employee_Search_Export.xlsx',
p_mime_type => l_export.mime_type
);
apex_mail.push_queue;
END;
```

## 总结
作者还开发了一个示例插件,可在GitHub获取:[email-classic-report-view](https://github.com/SyNuOra/PubWork/tree/main/APEX/plugins/email-classic-report-view)。