在oracle使用过程中,我们可以通过pl/sql生成数据文件,也可以通过spool on spool off生成,但某些环境下,我们需要通过存储过程处理数据,数据处理完,需要自动生成数据文件,手工导出生成方式便不适用。

下面我们尝试这样处理,能够满足我们的需求

第一步:发送带附件邮件必须需可以生成附件,检查是系统是否有权限

select * from all_directories

默认系统配置有“DATA_PUMP_DIR”,如果没有联系dba创建

create directory DATA_PUMP_DIR as   “ /oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/log/”

第二步:定义处理过程,过程输出是逗号分隔的文本,包括sql字段名称

输入为:查询的sql语句,存放路径,文件名

处理过程:

CREATE OR REPLACE PROCEDURE "EXP_DATA"
(
        P_QUERY IN VARCHAR2,              -- sql语句 例子: 'select * from TEST'
        P_DIR IN VARCHAR2,                -- 目录  用这个命令查看目录show parameter utl_file_dir
        P_FILENAME IN VARCHAR2            --  要生成的文件名
    )
    IS
        L_OUTPUT UTL_FILE.FILE_TYPE;
        L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
        L_COLUMNVALUE VARCHAR2(4000);
        L_STATUS INTEGER;
        L_COLCNT NUMBER := 0;
        L_SEPARATOR VARCHAR2(1);
        L_DESCTBL DBMS_SQL.DESC_TAB;
        P_MAX_LINESIZE NUMBER := 32000;
    BEGIN
        --OPEN FILE
        L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
        --DEFINE DATE FORMAT
        EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
        --OPEN CURSOR
        DBMS_SQL.PARSE( L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE );
        DBMS_SQL.DESCRIBE_COLUMNS( L_THECURSOR, L_COLCNT, L_DESCTBL );
        --DUMP TABLE COLUMN NAME
      FOR I IN 1 .. L_COLCNT LOOP
           UTL_FILE.PUT( L_OUTPUT,L_DESCTBL(I).COL_NAME);
           if i<L_COLCNT then
               UTL_FILE.PUT(L_OUTPUT,',');
           end if;
           DBMS_SQL.DEFINE_COLUMN( L_THECURSOR, I, L_COLUMNVALUE, 4000 );
           L_SEPARATOR := '';
       END LOOP;
       UTL_FILE.NEW_LINE( L_OUTPUT );
        --EXECUTE THE QUERY STATEMENT
        L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
        --DUMP TABLE COLUMN VALUE
        WHILE ( DBMS_SQL.FETCH_ROWS(L_THECURSOR) > 0 ) LOOP
            L_SEPARATOR := ',';
            FOR I IN 1 .. L_COLCNT LOOP
                if i< L_COLCNT then
                 begin
                DBMS_SQL.COLUMN_VALUE( L_THECURSOR, I, L_COLUMNVALUE );
                UTL_FILE.PUT( L_OUTPUT,
                TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE,',',' ')));
                UTL_FILE.PUT(L_OUTPUT,',');
                end;
                else
                  begin
                 DBMS_SQL.COLUMN_VALUE( L_THECURSOR, I, L_COLUMNVALUE );
                UTL_FILE.PUT( L_OUTPUT,
                TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE,',',' ')));
                  end;
                end if;
                L_SEPARATOR := ',';
            END LOOP;
            UTL_FILE.NEW_LINE( L_OUTPUT );
        END LOOP;
        --CLOSE CURSOR
        DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
        --CLOSE FILE
        UTL_FILE.FCLOSE( L_OUTPUT );
END;

第三步:测试输出,特别注意如果是linux环境,文件名称对大小写敏感,即输出文件名与使用引用的文件名必须一致。

exec EXP_DATA('select xh 序号,hm号码,flag 标志 from test','DATA_PUMP_DIR','TEST.CSV');

ORACLE发送带附件邮件的二三事之一的更多相关文章

  1. Spring发送带附件邮件

    下面是一个例子使用Spring通过Gmail SMTP服务器来发送电子邮件附件.为了包含附件的电子邮件,你必须使用 Spring的JavaMailSender及MimeMessage 来代替 Mail ...

  2. 利用spring-mail模块发送带附件邮件dome

    本例为maven项目,直接撸代码吧. pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...

  3. 接口测试基础——第2篇smtplib发送带附件的邮件

    我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIM ...

  4. java发送带附件的邮件

    /** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...

  5. C#发送带附件的邮件的代码

    如下的代码是关于C#发送带附件的邮件的代码. MailMessage m = new MailMessage();m.Subject = "File attachment!";m. ...

  6. 利用Python+163邮箱授权码发送带附件的邮件

    背景 前段时间写了个自动爬虫的脚本,定时在阿里云服务器上执行,会从某个网站上爬取链接保存到txt文本中,但是脚本不够完善,我需要爬虫完毕之后通过邮件把附件给我发送过来,之前写过一个<利用Pyth ...

  7. python 发送带附件的邮件

    特别注意的地方:filespart.add_header("Content-Disposition","attachment",filename=file_na ...

  8. [SpringBoot] - 发送带附件的邮件

    <!--发送email依赖--> <dependency> <groupId>org.springframework.boot</groupId> &l ...

  9. java mail邮件发送(带附件) 支持SSL

    java mail邮件发送(带附件)有三个类 MailSenderInfo.java package mail; import java.util.Properties; import java.ut ...

随机推荐

  1. FragmentTabHost简单保存状态的方法

    private View rootView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container ...

  2. Django ORM、一对一、一对多、多对多、详解

    上篇博客也提到这些知识点,可能大家还是不太清楚,这篇博客为大家详细讲解ORM中的几个知识点 1.1首先我们先看一个小案例: #_*_coding:utf-8_*_ from django.db imp ...

  3. [教程]phpwind9.0应用开发基础教程

    这篇文章着重于介绍在9.0中如何开发一个插件应用的示例,step by step来了解下在9.0中一个基础的应用包是如何开发的.1.目录结构OK,首先是目录结构,下面是一个应用我们推荐的目录. 应用包 ...

  4. c语言之I/O函数

    c语言中常用的I/O函数 最常用的字符串的标准I/O函数有getchar().putchar().gets().puts().scanf().printf().fputs().fgets().getc ...

  5. angular服务二

    angular服务 $http 实现客户端与服务器端异步请求 get方式 test.html <!DOCTYPE html> <html lang="en"> ...

  6. Git,non-fast-forward

    当把coding好的code,push到Git时会出现这个错误:master[rejected  non-fast-forward] 问题(Non-fast-forward)的出现原因在于:git仓库 ...

  7. cent6.4使用

    让centos能够上网 刚安装了时,是不能联网的,我们可以通过以下命令更改即可: cd /etc/sysconfig/network-script vi ifcfg-eth0 更改其中的ONBOOT= ...

  8. WdatePicker小结

    WdatePicker.js日期插件: 1. %y  当前年  %M  当前月  %d  当前日  %ld 本月最后一天  %H  当前时  %m  当前分  %s  当前秒 2.可以通过配置minD ...

  9. php跳转页面

    1.header(location:'url'); header函数前面不能有输出 ! 可以先输出到缓存. 2js echo "<script language='javascript ...

  10. Struts2之HelloWorld

    首先既然是开发Struts程序的话,那么自然需要用到Struts2开发包,Struts2是apache旗下的开源框架,所有的开发包和源代码都可以在Apache官网下载. 那么,就来开始编写第一个Str ...