PB 使用utl_file讀寫oracle bfile的封裝.

来至 http://blog.chinaunix.net/uid-173640-id-4187617.html

pb 開發使用 Oracle數據開發系統時,

一般情況下無法讀寫oracle bfile數據,
可重新封裝package讓PB調用.
測試代碼如下
pb package封裝

点击(此处)折叠或打开

  1. create or replace package PB_API is
  2. /****************************************
  3.    Ver Date Author Description
  4.    --------- ---------- --------------- ------------------------------------
  5.    1.0 2014-3-24 gangjh 1. pb 無法返回record 類型.
  6.                                             無法調用某些package
  7.                                             重新封裝一下
  8. *****************************************************************/

  9.  function fopen(location IN VARCHAR2,
  10.                  filename IN VARCHAR2,
  11.                  open_mode IN VARCHAR2) return INTEGER ;
  12.  
  13.  PROCEDURE fput_raw(p_file IN integer, buffer IN RAW) ;
  14.  PROCEDURE fclose(p_file IN integer) ;
  15.  
  16.  
  17.  function blob_new return INTEGER ;
  18.  PROCEDURE blob_put_raw(p_loc IN integer, buffer IN RAW) ;
  19.  function blob_get_value(p_loc in integer ) return blob ;
  20.  PROCEDURE blob_tofile(p_loc IN integer, p_file varchar2) ;

  21.  PROCEDURE blob_close(p_loc IN integer) ;
  22.  
  23.  function get_blob(src in bfile ) return blob ;
  24.  
  25.  procedure test ;

  26. end PB_API;
  27. /
  28. create or replace package body PB_API is


  29.  type file_type_tab is table of utl_file.file_type ;
  30.  type blob_tab is table of blob ;
  31.  
  32.  v_files file_type_tab := new file_type_tab() ;
  33.  v_lobs blob_tab := new blob_tab();

  34.  function fopen(location IN VARCHAR2,
  35.                  filename IN VARCHAR2,
  36.                  open_mode IN VARCHAR2) return INTEGER is
  37.    aa utl_file.file_type ;
  38.    x number ;
  39.  BEGIN
  40.    v_files.extend() ;
  41.    x := v_files.last() ;
  42.    aa:= utl_file.fopen(location , filename , open_mode) ;
  43.    v_files(x) := aa;
  44.    return x ;
  45.  END fopen;
  46.  
  47.  

  48.    PROCEDURE fput_raw(p_file IN integer, buffer IN RAW) is
  49.    begin
  50.      utl_file.put_raw(v_files(p_file), buffer) ;
  51.    end ;
  52.           
  53.    PROCEDURE fclose(p_file IN integer) is
  54.    begin
  55.      utl_file.fclose(v_files(p_file)) ;
  56.      v_files.delete(p_file) ;
  57.      v_files.trim() ;
  58.    end ;
  59.    

  60.    
  61.  function blob_new return INTEGER is
  62.    x integer ;
  63.  begin
  64.    v_lobs.extend() ;
  65.    x := v_lobs.last() ;
  66.    dbms_lob.createtemporary(v_lobs(x), true) ;
  67.    return x;
  68.  end ;
  69.  
  70.    
  71.    PROCEDURE blob_put_raw(p_loc IN integer, buffer IN RAW) is
  72.    begin
  73.       dbms_lob.append(v_lobs(p_loc) ,buffer);
  74.    end ;
  75.    

  76. -- for pb use set trans_object
  77.    function blob_get_value(p_loc in integer ) return blob is
  78.    begin
  79.         return v_lobs(p_loc) ;
  80.    end ;
  81.  
  82.    PROCEDURE blob_close(p_loc IN integer) is
  83.  
  84.    begin
  85.      dbms_lob.freetemporary(v_lobs(p_loc)) ;
  86.      v_lobs.delete(p_loc) ;
  87.      v_lobs.trim() ;
  88.    end ;
  89.        
  90.    PROCEDURE blob_tofile(p_loc IN integer, p_file varchar2) is
  91.    begin
  92.     utl_lob.to_file( blob_get_value(p_loc), 'MAILTEMP', p_file) ;
  93.    end ;
  94.       

  95. function get_blob(src in bfile ) return blob is
  96.   v_file varchar2(200);
  97.   v_path varchar2(200);
  98.   dest blob ;
  99.   bfile_loc bfile;
  100. begin
  101.   if src is null then
  102.     return null;
  103.   end if ;
  104.   dbms_lob.createtemporary(dest, true, dbms_lob.call) ;
  105.   dbms_lob.filegetname(src, v_path, v_file) ;
  106.   
  107.   bfile_loc := bfilename(v_path, v_file) ;
  108.   dbms_lob.open(bfile_loc, dbms_lob.lob_readonly);
  109.   dbms_lob.loadfromfile(dest, bfile_loc, dbms_lob.getlength(bfile_loc) ) ;
  110.   dbms_lob.close(bfile_loc) ;
  111.   return dest ;
  112.     
  113. end ;
  114.        
  115.    
  116. end PB_API;
  117. /

PB端封裝,定義user transaction object

点击(此处)折叠或打开

  1. $PBExportHeader$uo_trans_yy3mat.sru
  2. forward
  3. global type uo_trans_yy3mat from transaction
  4. end type
  5. end forward

  6. global type uo_trans_yy3mat from transaction
  7. end type
  8. global uo_trans_yy3mat uo_trans_yy3mat

  9. type prototypes
  10. subroutine PBAPI_FCLOSE(long P_FILE) RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"FCLOSE~""
  11. function long PBAPI_FOPEN(string LOCATION,string FILENAME,string OPEN_MODE) RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"FOPEN~""
  12. subroutine PBAPI_FPUT_RAW(long P_FILE,blob BUFFER) RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"FPUT_RAW~""


  13. function long PBAPI_BLOB_NEW() RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"BLOB_NEW~""
  14. subroutine PBAPI_BLOB_PUT_RAW(long P_LOC,blob BUFFER) RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"BLOB_PUT_RAW~""
  15. subroutine PBAPI_BLOB_CLOSE(long P_LOC) RPCFUNC ALIAS FOR "~"PCNDBA~".PB_API.~"BLOB_CLOSE~""

  16. end prototypes
  17. type variables
  18. //
  19. end variables

  20. forward prototypes
  21. public function integer fwritefile (string filename, string dbpath, string dbfile)
  22. public function integer fwriteblob (string filename)
  23. end prototypes

  24. public function integer fwritefile (string filename, string dbpath, string dbfile);integer li_FileNum, loops, i
  25. long flen, bytes_read
  26. blob b
  27. long filehandle;


  28. flen = FileLength(filename)
  29. li_FileNum = FileOpen(filename, StreamMode!, Read!, LockRead!)

  30. if ( li_FileNum = -1 or isnull(li_FileNum) ) then
  31. messagebox('error', 'file ['+filename+'] read error') ;
  32. return -1;
  33. end if ;

  34. IF flen > 32765 THEN
  35. IF Mod(flen, 32765) = 0 THEN
  36. loops = flen/32765
  37. ELSE
  38. loops = (flen/32765) + 1
  39. END IF
  40. ELSE
  41. loops = 1
  42. END IF

  43. filehandle = PBAPI_FOPEN(dbpath, dbfile, "wb") ;


  44. FOR i = 1 to loops
  45. bytes_read = FileRead(li_FileNum, b)

  46. PBAPI_FPUT_RAW(filehandle, b) ;
  47. NEXT
  48. PBAPI_FCLOSE(filehandle);
  49. FileClose(li_FileNum)

  50. return 0



  51. end function

  52. public function integer fwriteblob (string filename);integer li_FileNum, loops, i
  53. long flen, bytes_read
  54. blob b
  55. long blobhandle;


  56. flen = FileLength(filename)
  57. li_FileNum = FileOpen(filename, StreamMode!, Read!, LockRead!)

  58. if ( li_FileNum = -1 or isnull(li_FileNum) ) then
  59. messagebox('error', 'file ['+filename+'] read error') ;
  60. return -1;
  61. end if ;

  62. IF flen > 32765 THEN
  63. IF Mod(flen, 32765) = 0 THEN
  64. loops = flen/32765
  65. ELSE
  66. loops = (flen/32765) + 1
  67. END IF
  68. ELSE
  69. loops = 1
  70. END IF

  71. blobhandle = PBAPI_BLOB_NEW() ;
  72. if sqlcode <> 0 then
  73. messagebox('error', sqlerrtext) ;
  74. return -1;
  75. end if;

  76. FOR i = 1 to loops
  77. bytes_read = FileRead(li_FileNum, b)
  78. PBAPI_BLOB_PUT_RAW(blobhandle, b) ;
  79. if sqlcode <> 0 then
  80. messagebox('error', sqlerrtext) ;
  81. end if;
  82. NEXT

  83. //PBAPI_BLOB_CLOSE(filehandle);

  84. FileClose(li_FileNum)

  85. return blobhandle



  86. end function

  87. on uo_trans_yy3mat.create
  88. call super::create
  89. TriggerEvent( this, "constructor" )
  90. end on

  91. on uo_trans_yy3mat.destroy
  92. TriggerEvent( this, "destructor" )
  93. call super::destroy
  94. end on



PB測試代碼:
在buttun click事件中入調用代碼

点击(此处)折叠或打开

  1. string ls_path, ls_file_name, ls_filetype
  2. integer li_value ;
  3. blob xlsdata ;

  4. li_value = GetFileOpenName('選擇檔案:', ls_path, ls_file_name, "xls","Excel 2000 Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx,OpenOffice Files (*.ods),*.ods,ALL Files (*.*),*.*")

  5. IF LI_VALUE <> 1 AND LI_VALUE <> 0 THEN
  6. MESSAGEBOX('提示:','無效路徑或文件名!!!',STOPSIGN!)
  7. RETURN
  8. ELSEIF LI_VALUE = 0 THEN
  9. //沒有選舉文件 cancel退出
  10. RETURN
  11. END IF




  12. sqlca.fwritefile(ls_path, 'MAILTEMP', ls_file_name) ;

以上,及可將本地文件寫入主機目錄.
查詢bfile時,需將bfile轉為blob

点击(此处)折叠或打开

  1. select pb_api.get_blob(bfilename('MAILTEMP','cc.sql'))
  2. from dual;

阿飛
2014/03/29










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值