较老得plsql不能处理与OS的交互,比如获得文件目录,获得文件的大小等等,

plsql从9I开始支持javasource使用java处理OS交互。

例如

需求 :导入到指定目录下面所有的文件到数据库,文件类型可能是图片,PDF,WORD等。

INPUT

1.  指定的目录(包含子文件夹)

2.  指定的文件类型(suffix such as .pdf,take all is *) Such as

exec pkg_file.FILE_INPUT('D:\SYSTEM','*');

EXPORT

1.  指定的文件名(包含全路经)

2.  指定的数据库中导出文件的文件ID Suchas

execpkg_file.FILE_EXPORT('D:\kaokaokao.jpg',708);

Java IO FILE refer

  • http://download.oracle.com/javase/6/docs/api/java/io/File.html


GRANT JAVAUSERPRIV TO SCOTT;
GRANT Create ANY Directory TO SCOTT;
GRANT DROP ANY Directory TO SCOTT; DECLAREl_schema VARCHAR2(30) := 'SCOTT';
BEGINDBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
END;
/CREATE SEQUENCE SEQ_FILE START WITH 1 INCREMENT BY 1;CREATE TABLE FILE_LIST_INFO
( FILE_ID   NUMBER(10) PRIMARY KEY,FILE_NAME VARCHAR(200 CHAR) NOT NULL,FILE_PATH VARCHAR(200 CHAR) NOT NULL,FILE_TYPE VARCHAR(20 CHAR),FILE_LENGTH NUMBER(20) NOT NULL,FILE_CREATE_TIME VARCHAR(20 CHAR),FILE_MODIFY_TIME VARCHAR(20 CHAR),FILE_UPDATE_TIME DATE NOT NULL,FILE_LIST_ID NUMBER(10)
) ROWDEPENDENCIES;CREATE TABLE FILE_LIST
( LIST_ID     NUMBER(10) PRIMARY KEY,LIST_DATE   DATE DEFAULT SYSDATE,LIST_FILE   BLOB
) ROWDEPENDENCIES;create or replace and compile java source named DirList asimport java.lang.*;import java.io.*;import java.sql.*;import oracle.jdbc.*;import oracle.sql.*;import java.util.*;import java.text.*;public class DirList{ static void Process(File path_file,String path_suffix) throws SQLException{String v_file_name;String v_file_path;String v_parent_path;String v_file_type;long v_file_length;long v_file_modify;if(path_file.isFile()){v_file_name =path_file.getName();v_file_path =path_file.getPath();v_parent_path=path_file.getParent();v_file_type ="FILE";v_file_length =path_file.length();v_file_modify =path_file.lastModified(); Date d = new Date(v_file_modify);SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");String v_file_dateString = sdf.format(d);if (path_suffix.equals("*")){Connection conn = null;CallableStatement cs = null;String val = null;conn = DriverManager.getConnection("jdbc:default:connection");cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");cs.setString(1, v_file_name);cs.setString(2, v_file_path);cs.setString(3, v_file_type);cs.setFloat(4, v_file_length);cs.setString(5, v_file_dateString);cs.setString(6, v_parent_path);cs.execute();cs.close();conn.close();}else{if (v_file_name.endsWith(path_suffix)){Connection conn = null;CallableStatement cs = null;String val = null;conn = DriverManager.getConnection("jdbc:default:connection");cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");cs.setString(1, v_file_name);cs.setString(2, v_file_path);cs.setString(3, v_file_type);cs.setFloat(4, v_file_length);cs.setString(5, v_file_dateString);cs.setString(6, v_parent_path);cs.execute();cs.close();conn.close();}}}else if (path_file.isDirectory()){v_file_name =path_file.getName();v_file_path =path_file.getPath();v_parent_path=path_file.getParent();v_file_type ="DIRECTORY";v_file_length =0;v_file_modify =path_file.lastModified(); Date d = new Date(v_file_modify);SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");String v_file_dateString = sdf.format(d);Connection conn = null;CallableStatement cs = null;String val = null;conn = DriverManager.getConnection("jdbc:default:connection");cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");cs.setString(1, v_file_name);cs.setString(2, v_file_path);cs.setString(3, v_file_type);cs.setFloat(4, v_file_length);cs.setString(5, v_file_dateString);cs.setString(6, v_parent_path);cs.execute();cs.close();conn.close();File[] listOfFiles = path_file.listFiles();if(listOfFiles!=null){for (int j = 0; j < listOfFiles.length; j++){Process(listOfFiles[j],path_suffix);}} }}public static void Inputfile(String directory,String suffix)throws SQLException{File path = new File( directory );#sql { truncate table FILE_LIST_INFO};#sql { truncate table FILE_LIST};Process(path,suffix);}public static void Exportfile(String myFile, BLOB myBlob) throws Exception{// Bind the image object to the database object// Open streams for the output file and the blobFile binaryFile = new File(myFile);FileOutputStream outStream = new FileOutputStream(binaryFile);InputStream inStream = myBlob.getBinaryStream();// Get the optimum buffer size and use this to create the read/write bufferint size = myBlob.getBufferSize();byte[] buffer = new byte[size];int length = -1;// Transfer the datawhile ((length = inStream.read(buffer)) != -1){outStream.write(buffer, 0, length);outStream.flush();}// Close everything downinStream.close();outStream.close();} };
/CREATE OR REPLACE PACKAGE PKG_FILE ASPROCEDURE FILE_INPUT(P_DIRECTORY IN VARCHAR2, P_SUFFIX IN VARCHAR2);PROCEDURE FILE_INPUT_DB(P_FILENAME   IN VARCHAR2,P_FILEPATH   IN VARCHAR2,P_FILETYPE   IN VARCHAR2,P_FILELENGTH IN NUMBER DEFAULT 0,P_FILEMODIFY IN VARCHAR2,P_PARENTPATH IN VARCHAR2);PROCEDURE FILE_EXPORT_JAVA(P_FILE IN VARCHAR2, P_BLOB IN BLOB);PROCEDURE FILE_EXPORT(P_FILEPATH  IN VARCHAR2,P_FILEID IN NUMBER);
END;
/CREATE OR REPLACE PACKAGE BODY PKG_FILE ASPROCEDURE FILE_INPUT(p_directory IN VARCHAR2, p_suffix IN VARCHAR2) ASLANGUAGE JAVA NAME 'DirList.Inputfile( java.lang.String , java.lang.String)';PROCEDURE FILE_INPUT_DB(P_FILENAME   IN VARCHAR2,P_FILEPATH   IN VARCHAR2,P_FILETYPE   IN VARCHAR2,P_FILELENGTH IN NUMBER DEFAULT 0,P_FILEMODIFY IN VARCHAR2,P_PARENTPATH IN VARCHAR2) ISl_blob       BLOB;l_bfile      BFILE;v_sql_insert VARCHAR2(200);BEGIN--dynamic create the direcory FILE_DIRBEGINv_sql_insert := 'Create Or Replace Directory FILE_DIR As ' || '''' ||P_PARENTPATH || '\''';EXECUTE IMMEDIATE v_sql_insert;EXCEPTIONWHEN OTHERS THENRAISE_APPLICATION_ERROR(-20017,'Can Not Dynamic Create the FILE_DIR Directory.' ||SQLERRM);END;IF P_FILETYPE = 'FILE' THENINSERT INTO FILE_LIST_INFO(FILE_ID,FILE_NAME,FILE_PATH,FILE_TYPE,FILE_LENGTH,FILE_UPDATE_TIME,FILE_MODIFY_TIME,FILE_LIST_ID)VALUES(SEQ_FILE.NEXTVAL,P_FILENAME,P_FILEPATH,P_FILETYPE,P_FILELENGTH,SYSDATE,P_FILEMODIFY,SEQ_FILE.CURRVAL);INSERT INTO FILE_LIST(LIST_ID, LIST_FILE)VALUES(SEQ_FILE.CURRVAL, empty_blob())RETURNING LIST_FILE INTO l_blob;l_bfile := bfilename('FILE_DIR', P_FILENAME);dbms_lob.fileopen(l_bfile);dbms_lob.loadfromfile(l_blob, l_bfile, dbms_lob.getlength(l_bfile));dbms_lob.fileclose(l_bfile);ELSEINSERT INTO FILE_LIST_INFO(FILE_ID,FILE_NAME,FILE_PATH,FILE_TYPE,FILE_LENGTH,FILE_UPDATE_TIME,FILE_MODIFY_TIME)VALUES(SEQ_FILE.NEXTVAL,P_FILENAME,P_FILEPATH,P_FILETYPE,P_FILELENGTH,SYSDATE,P_FILEMODIFY);END IF;COMMIT;END;PROCEDURE FILE_EXPORT_JAVA(P_FILE IN VARCHAR2, P_BLOB IN BLOB) ASLANGUAGE JAVA NAME 'DirList.Exportfile( java.lang.String, oracle.sql.BLOB)';PROCEDURE FILE_EXPORT(P_FILEPATH IN VARCHAR2, P_FILEID IN NUMBER) ISv_fileid   NUMBER(10);v_filename VARCHAR(200);v_filetype VARCHAR(20);v_blob     BLOB;BEGIN--check the file idBEGINSELECT FILE_LIST_INFO.FILE_LIST_ID,FILE_LIST_INFO.FILE_NAME,FILE_LIST_INFO.FILE_TYPE,FILE_LIST.LIST_FILEINTO v_fileid, v_filename, v_filetype, v_blobFROM FILE_LIST_INFO, FILE_LISTWHERE FILE_LIST_INFO.FILE_LIST_ID = FILE_LIST.LIST_IDAND FILE_LIST_INFO.FILE_LIST_ID = P_FILEID;EXCEPTIONWHEN NO_DATA_FOUND THENRAISE_APPLICATION_ERROR(-20017,'Can Not Find The File ID.' ||SQLERRM);END;FILE_EXPORT_JAVA(P_FILEPATH,v_blob);END;
END PKG_FILE;
/

Oracle JAVA SORCE and BLOB OBJECT相关推荐

  1. 用oracle的java存储过程实现BLOB字段的字符串读取

    阅读了一个帖子"有没有可能写出比Oracle 函数更快的外部存储过程"(http://www.itpub.net/thread-1117461-1-1.html ) 突发灵感,加上 ...

  2. oracle 传递table,将对象类型表从java传递到oracle 8i(Pass table of object type from java to oracle 8i)...

    将对象类型表从java传递到oracle 8i(Pass table of object type from java to oracle 8i) 我需要将一个对象列表(如值表)从java传递给ora ...

  3. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数

    作者: zyl910 一.缘由 BLOB是指二进制大对象,也就是英文Binary Large Object的缩写. 在很多时候,我们是通过其他编程语言(如Java)访问BLOB的字节数据,进行字节级的 ...

  4. Oracle Java Mission Control:终极指南

    "我们喜欢关注Mikhail Vorontsov的博客,并获得他对Java Performance相关问题的看法. 我们曾多次被问到Takipi的Java错误分析与Java Mission ...

  5. Oracle java官网关于可重入读写锁ReentrantReadWriteLock的解析

    Oracle java官网关于可重入读写锁ReentrantReadWriteLock的解析 1.[原文链接](https://docs.oracle.com/javase/8/docs/api/ja ...

  6. oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)

    发布日期:2011-10-20 更新日期:2011-10-20 受影响系统: Oracle Sun JRE 1.6.x Oracle Sun JDK 1.6.x 不受影响系统: Oracle Sun ...

  7. Windows下 安装Oracle Java 11 并设置环境变量

    Oracle Java 11 官网:Java SE Development Kit 11- - Downloads 2019-5-30:最新的版本是11.0.3 选择Windows版本: 注意:现在下 ...

  8. Oracle Schema Objects(Schema Object Storage And Type)

    One characteristic of an RDBMS is the independence of physical data storage from logical data struct ...

  9. Ubuntu上安装oracle java 7

    Ubuntu上安装oracle java 7 from: http://sddhn.blog.163.com/blog/static/128187792013103014453434/ 1.通过PPA ...

最新文章

  1. 矩阵分析与多元统计II 二次型与二次曲面2 双线性函数
  2. Go mod 七宗罪
  3. 喜用神最正确的算法_各种电磁仿真算法的优缺点和适用范围(FDTD, FEM和MOM等)...
  4. zoj 1006 Do the Untwist 簡單字符串
  5. 动手学深度学习(PyTorch实现)(一)--线性回归
  6. SSH与EJB 比较
  7. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  8. Kafka模拟实现(用于自我测试环境)
  9. java泛型中的通配符 extends与super
  10. 视频教程_Mastercam2017车削视频教程,数控车床编程视频教程,vericut车床仿真视频...
  11. 怎样将UltraISO做的启动U盘还原成原来的样子
  12. Openfile安装和使用
  13. ubuntu独立显卡驱动
  14. 中点和中值滤波的区别_【传感器融合】扩展卡尔曼滤波的逐步理解与实现(上)...
  15. 名悦集团:什么是驾驶证终身免检,要满足什么条件
  16. 5.5 设置UITableView单元格背景色 [原创iOS开发-Xcode教程]
  17. 入手评测oppofindx3和苹果12pro有什么区别 哪个好详细参数对比
  18. HTTPSS证书制作笔记
  19. node安装升级思考
  20. PX4装机教程(七)几种常用的遥控器的使用

热门文章

  1. Fibonacci数列也可以求通项?
  2. Autofac的使用
  3. 【个人代码及思路】2017年12月CSP第二题:游戏
  4. 球状空心介孔硫化铋/二氧化硅纳米微球/全无机铯铅卤化物钙钛矿纳米晶修饰二氧化硅微球相关制备
  5. 【Java基础】之AWT,一篇文章搞懂awt(包含绘图)
  6. 输入x,根据以下函数关系,对输入的x值,计算出相应的y值。
  7. notes邮件正文显示不全_notes常见问题解决
  8. 2023吉林大学计算机考研信息汇总
  9. Linux安装与使用:
  10. 优雅的PHP采集框架QueryList