1、也再回忆下当时很牛X,现在还依然感觉很酷的纯命令编译程序吧编译带包的java类(以包名为pra,类名为HelloWorld为例):javac -d . HelloWorld.java运行带包的类:java pra.HelloWorld生成API文档(生成在docs文件夹下):javadoc -d .docs HelloWorld.java生成带相应描述的API文档:javadoc -version -author -d打jar包:jar -cvf pra.jar解压jar包:jar -xvf pra.jar运行jar包中的类:java -classpath pra.jar pra.HelloW
2、orld 或者java -cp pra.jar pra.HelloWorld在介绍PLSQL中嵌入JAVA程序编译输出HelloWorld之前,对钟爱于JAVA的码农们说句话:JAVA的魅力依旧是ORACLE取代不了的1.下面是个简单的PLSQL程序嵌入JAVA类并编译输出的代码。CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED HELLOWORLD ASpublic class HelloWorld public static String entry() return Hello World!; CREATE OR REPLACE FUNCTI
3、ON FU_HELLOWORLD RETURN VARCHAR2AS LANGUAGE JAVANAME HelloWorld.entry() return java.lang.StringSELECT FU_HELLOWORLD FROM DUAL;2.PLSQL对数据的强大处理功能是毋庸置疑的,但在应用级别还是有居多限制,不过ORACLE官方提供了许多功能还不错的内置包。现在先来介绍下后续功能的核心包UTL_FILE,ORACLE提供的内置包,包含多种过程及方法,可以实现目录(DIRECTORY ORACLE不能访问操作系统级的文件夹,需要创建特定目录才能够访问)下的文件读取写入,具体实现
4、加密,无从了解其实现原理,其应用可以与JAVA中的基本流比照。其功能有极大限制,但是可以实现基本的文件读取写入等操作。前段时间写了个东东,代码如下,GGMM们可以瞧下,消遣下。-创建配置表DECLARE -action:创建存储目录文件表 -author:hehe -date:2014-01-23 V_COUNT NUMBER(2); V_SQL VARCHAR2(32767);BEGIN -判断表存在 SELECT COUNT(*) INTO V_COUNT FROM USER_TABLES WHERE TABLE_NAME=T_DIRLIST IF V_COUNT=1 THEN -如果存在
5、DROP掉 EXECUTE IMMEDIATE DROP TABLE T_DIRLIST END IF; -如果不存在,重新创建 V_SQL:=CREATE TABLE T_DIRLIST(FILENAME VARCHAR2(255),FILESIZE NUMBER,FILEDATE DATE) EXECUTE IMMEDIATE V_SQL;COMMENT ON TABLE T_DIRLIST IS 存储目录文件表COMMENT ON COLUMN T_DIRLIST.FILENAME IS 文件名称 T_DIRLIST.FILESIZE IS文件大小文件最后操作时间 -创建序列 SELEC
6、T COUNT(*) INTO V_COUNT FROM USER_SEQUENCES WHERE SEQUENCE_NAME=SEQ IF V_COUNT=0 THENCREATE SEQUENCE SEQ START WITH 1END;/-创建java类用于文件夹操作create or replace and compile java source named dirlist asimport java.io.*;import java.sql.*;public class DirList action:获取目录下文件 author: date:public static void ge
7、tList(String directory) throws SQLException /创建文件对象 File path=new File(directory); String fileList=path.list(); String fileName; long fileSize; long fileDate; /清除表中的所有记录 #sqldelete from t_dirlist; #sqlcommit; /循环取出获取目录中的文件名及创建时间 for (int i=0;ifileList.length; i+) fileName=fileList; File fpath=new Fi
8、le(directory+/+fileName); /获取对象大小 fileSize=fpath.length(); /获取对象的最后修改时间 fileDate=fpath.lastModified(); /向表中插入记录 #sqlinsert into t_dirlist(filename, filesize, filedate) values(:fileName,:fileSize,to_date(01/01/1970,mm/dd/yyyy)+:fileDate/(24*60*60*1000); /提交事务-具体实现包CREATE OR REPLACE PACKAGE PA_FILEAS
9、PROCEDURE PR_GETDIRLIST(I_DIRECTORY VARCHAR2);获取目录下的所有文件 /*参数说明 *I_DIRECTORY 目录名称 */ PROCEDURE PR_READTOWRITE_FILE(I_READ_DIR VARCHAR2, I_WRITE_DIR I_WRITE_FILE VARCHAR2);读取I_READ_DIR 目录下的所有文件,到I_WRITE_DIR目录下的对应文件 *I_READ_DIR 读取文件的目录 *I_WRITE_DIR 写入文件的目录 *I_WRITE_FILE 写入的文件名 PROCEDURE PR_READTOWRITE
10、_DECLARE(I_READ_DIR I_READ_FILE VARCHAR2 DEFAULT DECLARE.SQL,读取I_READ_DIR 目录下的I_READ_FILE文件,到I_WRITE_DIR目录下的对应文件 *I_READ_FILE 读取的文件名END PA_FILE;CREATE OR REPLACE PACKAGE BODY PA_FILE PROCEDURE PR_GETDIRLIST(I_DIRECTORY IN VARCHAR2) AS LANGUAGE JAVA NAME DirList.getList(java.lang.String) I_WRITE_FILE
11、 VARCHAR2) AS V_READ_DIR VARCHAR2(1000) :=TRIM(UPPER(I_READ_DIR); V_WRITE_DIR=TRIM(UPPER(I_WRITE_DIR); V_WRITE_FILE=TRIM(UPPER(I_WRITE_FILE); V_OWNER VARCHAR2(38)=SYS_CONTEXT(USERENVCURRENT_USER V_DIR V_FILE_WRITE UTL_FILE.FILE_TYPE; V_FILE_READ V_BUFFER V_FILENAME V_GOL V_CUR SYS_REFCURSOR; CURSOR
12、CUR_FILENAME IS SELECT FILENAME FROM T_DIRLIST WHERE FILENAME AND SUBSTR(TRIM(UPPER(FILENAME),INSTR(TRIM(FILENAME),.)=.SQL ORDER BY FILENAME; BEGIN -获取读取文件的目录下的所有文件 -授予java访问目录权限SELECT DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME IN( |V_READ_DIR|V_WRITE_DIR|) OPEN V_CUR FOR V_SQL; FETCH
13、V_CUR INTO V_DIR; WHILE V_CUR%FOUND LOOPCALL dbms_java.grant_permission(|V_OWNER| |SYS:java.io.FilePermission |V_DIR|, read -DBMS_OUTPUT.put_line(V_SQL);CALL dbms_java.grant_permission(* END LOOP; SELECT DIRECTORY_PATH INTO V_DIR FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME=V_READ_DIR; PR_GETDIRLIST(V_
14、DIR); -首次清除所有记录 V_FILE_WRITE :=UTL_FILE.FOPEN(V_WRITE_DIR,V_WRITE_FILE,W-W覆盖写入 -写入空 UTL_FILE.PUT_LINE(V_FILE_WRITE, UTL_FILE.FFLUSH(V_FILE_WRITE); UTL_FILE.FCLOSE(V_FILE_WRITE); - -打开要写入的文件A-A 追加 -循环读取文件下的文件 FOR CUR_GET_FILENAME IN CUR_FILENAME -获取文件名 V_FILENAME:=TRIM(CUR_GET_FILENAME.FILENAME); -写入
15、空行 -写入注释 V_GOL:SET ECHO ON; UTL_FILE.PUT_LINE(V_FILE_WRITE,V_GOL);REM 创建|SUBSTR(V_FILENAME,1,INSTR(V_FILENAME,)-1);SET ECHO OFF; -打开文件 V_FILE_READ:=UTL_FILE.FOPEN(V_READ_DIR,V_FILENAME,R -读取文件 UTL_FILE.GET_LINE(V_FILE_READ,V_BUFFER); -写入文件 UTL_FILE.PUT_LINE(V_FILE_WRITE,V_BUFFER); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END; -冲刷写入系统文件 UTL_FILE.FCLOSE(V_FILE_READ); -全部重新刷新输出释放 -异常处理,读取不到数据时,关闭流 WHEN OTHERS THEN RAISE; END PR_READTOWRITE_FILE; V_READ_FILE=TRIM(I_READ_FILE);=TRIM(I_WRITE_FILE); V_SEQ NUMBER(38); V_FILE_W
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1