• ORACLE发送带附件邮件的二三事之一


    在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');

  • 相关阅读:
    Android Studio 编译不通过,报错“找不到org.apache.http
    Android studio中出现非法字符时的部分解决方法
    eclipse项目导入到Android Studio Plugin with id 'android-library' not found
    将Eclipse代码导入到AndroidStudio的两种方式
    eclipse项目迁移到android studio(图文最新版)
    Android studio插件安装
    ViewPager PagerAdapter不更新视图
    Android:可扩展伸缩listview
    Android的崩溃错误报告之ACRA
    Android数据库ORMlite框架04
  • 原文地址:https://www.cnblogs.com/iHqq/p/5406932.html
Copyright © 2020-2023  润新知