終於搞定了從Linux下載入文字檔到資料庫CLOB欄位上

來源:互聯網
上載者:User

背景:搞些監控指令碼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.c 
unix2dos.c: text/x-c++; charset=us-ascii


第二步 檢查ORACLE字元集編碼

SELECT Nls_Charset_Id(Value) ,Value FROM V$NLS_VALID_VALUES  WHERE parameter = 'CHARACTERSET';

1 US7ASCII

第三步 建立目錄對象在ORACLE某個使用者下

 #CLOB_DIR="/home/oracle/dbscripts/logs"


第四步 編寫插入SHELL指令碼

#!/bin/bash
source ~/.bash_profile
 username=dba
 pass=007

chartset=$1

 #CLOB_DIR="/home/oracle/dbscripts/logs"

sqlplus -s $username/$pass <<EOF
set 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_sendmails
 VALUES (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


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.