背景:搞些监控脚本SHELL 后发现 每天登上服务器很麻烦,而且服务器越来越多了。
本来想用系统SendMail功能发,可公司说为了安全不可以。只好用应用系统发邮件功能!
然而该功能的邮件表内容是CLOB字段。
从盖国强 前辈网站看到的http://www.eygle.com/archives/2005/08/ecieoadbms_lobo.html按其上面做,最后发出来的邮件全是乱码!
用Linux export LANG=en_US.UTF8 也不行!
过了几天发现有dbms_lob包有额loadclobfrom file过程。而上面是使用loadfromfile过程 默认是装进二进制流,没有做字符转换。
上面介绍windows平台下先要把文本文件保存为unicode编码。在linux平台下如何用vi保存unicode呢? 如何 sh xxxx.sh > xxx.log呢?
讨厌死了Linux 每个小问题都搞贼复杂,转了一圈又一圈。vi ~/.vimrc 编入啥。。。。然后iconve。。。
那我就不给你们兜圈子了 顺序的来下
第一步 检查 你的系统中的文件类型是什么?
[oracle@DB-DG dbscripts]file -i unix2dos.cunix2dos.c: text/x-c++; charset=us-ascii
第二步 检查ORACLE字符集编码
SELECT Nls_Charset_Id(Value) ,ValueFROM V$NLS_VALID_VALUES WHERE parameter = ‘CHARACTERSET’;
1 US7ASCII
第三步 创建目录对象在ORACLE某个用户下
#CLOB_DIR="/home/oracle/dbscripts/logs"
第四步 编写插入SHELL脚本
#!/bin/bashsource ~/.bash_profileusername=dbapass=007
chartset=$1
#CLOB_DIR="/home/oracle/dbscripts/logs"
sqlplus -s $username/$pass <<EOFset serveroutput on;
declare l_bfile bfile; –文件句柄 l_clob clob; — CLOB段对象 l_str varchar2(1000); –异常信息 src_offset number:=1; –源偏移量 dst_offset number:=1; –目的偏移量 lang_ctx number:= dbms_lob.default_lang_ctx; charset_id number:=0; –语言字符集ID warning number; –警告ID begin
charset_id := NLS_CHARSET_ID(‘US7ASCII’); –获得数据库字符集编码ID
— charset_id:=NLS_CHARSET_ID(‘$charset’);
l_bfile := bfilename(‘CLOB_DIR’,’EveryDayReport.txt’); –获得文件句柄
–l_bfile := bfilename(‘CLOB_DIR’,’$FileName’);
insert into DBA_sendmailsVALUES (DBA_sendmails_seq.nextval, ‘dba01@139.COM’, ‘Warning’,’dba01@lotery.hk’,’lotery1401′,’DayReport_ALL’,empty_clob(),’smtp’,’smtp.gmail.com’,’465′, sysdate, sysdate) returning S_CONTENT into l_clob; –先插入记录进去,空CLOB对象, 并返回给CLOB变量 dbms_lob.fileopen(l_bfile);
dbms_lob.loadclobfromfile(l_clob,l_bfile,dbms_lob.getlength(l_bfile),src_offset,dst_offset,charset_id,lang_ctx,warning); –加载文件到CLOB字段中
dbms_lob.fileclose(l_bfile); commit;
exception when others then l_str:=sqlerrm(sqlcode); dbms_output.put_line(l_str); end; /
exit;
EOF
闽南的花市,一开始是来自漳州百花村,