使用UTF_FILE包,可以满足你的需要.
解决方案 »
- 求技术思路
- 有没有关于PL/SQL的好书介绍?
- drop或disable主键时,如何保留其索引?
- count与distinct用在一个语句中是否不太好
- 不知为何,我的8。17的DB不能自动启动呀,我的几个服务都设好的呀应该没有问题才对
- 【救命】视图中的sql代码(含子查询) copy 到 包过程中 编绎不通过?
- 有没有可能自己构造一个Ado数据集AdoRecordset?
- 救命!!请教!!oracle,pl/sql中type的一个用法的意思。
- 请问高手,如何移动oracle数据库
- sql查询树形视图,不查没有子节点的父行
- RMAN-06023: no backup or copy of datafile 6 found to restore
- 插入触发器,如何做到不执行插入,执行了更新
网上找了一个,能否注释一下。DECLARE
OutputFile UTL_FILE.FILE_TYPE;
vart_title perd11.ART_TITLE%TYPE;
vart_author perd11.ART_AUTHOR%TYPE;
vart_keyWord perd11.ART_KEYWORD%TYPE;
vart_abstract perd11.ART_ABSTRACT%TYPE;
vart_abs1 perd11.ART_ABSTRACT%TYPE;
vart_abs2 perd11.ART_ABSTRACT%TYPE;
vart_authorinstitute perd11.ART_AUTHORINSTITUTE%TYPE;
vperd_volume perd11.PERD_VOLUME%TYPE;
vperd_issue perd11.PERD_ISSUE%TYPE;
vperd_date perd11.PERD_DATE%TYPE;
vpub_name perd11.PUB_NAME%TYPE;
vpub_issn perd11.PUB_ISSN%TYPE;
vclass_name perd11.CLASS_NAME%TYPE;
CURSOR cperd11 IS
select * from perd11;
BEGIN
OutputFile := UTL_FILE.FOPEN
(’/export/home/oracle/output’,'perd11.out’,'a’);
open cperd11;
LOOP
fetch cperd11 into vart_no,vart_title,
vart_author,vart_keyword,vart_abstract,
vart_authorinstitute,vperd_volume,
vperd_issue,vperd_date,vpub_name,
vpub_issn,vclass_name;
IF length(vart_abstract)>1000 THEN
vart_abs1:=substr(vart_abstract,0,1000);
vart_abs2:=substr(vart_abstract,1001);
ELSE
vart_abs1:=vart_abstract;
vart_abs2:=”;
END IF;
UTL_FILE.PUTF(OutputFile,’
【期刊类别】\n%s\n’,vclass_name);
UTL_FILE.PUTF(OutputFile,’
【期刊刊号】\n%s\n’,vpub_issn);
UTL_FILE.PUTF(OutputFile,’
【期刊名称】\n%s\n’,vpub_name);
UTL_FILE.PUTF(OutputFile,’
【期刊卷号】\n%s\n’,vperd_volume);
UTL_FILE.PUTF(OutputFile,’
【期刊期号】\n%s\n’,vperd_issue);
UTL_FILE.PUTF(OutputFile,’
【出版日期】\n%s\n’,vperd_date);
UTL_FILE.PUTF(OutputFile,’
【中文标题】\n%s\n’,vart_chntitle);
UTL_FILE.PUTF(OutputFile,’
【中文作者】\n%s\n’,vart_chnauthor);
UTL_FILE.PUTF(OutputFile,’
【作者单位】\n%s\n’,vart_authorinstitute);
UTL_FILE.PUTF(OutputFile,’
【中文要害词】\n%s\n’,vart_chnkeyword);
UTL_FILE.PUTF(OutputFile,’
【中文文摘】\n%s\n’,vart_engabs1);
UTL_FILE.PUTF(OutputFile,’
【中文文摘2】\n%s\n’,vart_engabs2);
UTL_FILE.FFLUSH(OutputFile);
exit when cperd11%NOTFOUND;
END LOOP;
close cperd11;
END;
稍等一下... 给你在scott下面写一个,我会加上注释,你自己修改
--创建一个DIRECTORY UT 指向操作系统中的D盘目录(最好是用具有DBA权限的用户操作)
CREATE DIRECTORY UT AS 'D:\';
--授权读、写
GRANT WRITE,READ ON DIRECTORY UT TO PUBLIC;
--执行下面的PL/SQL块
DECLARE
V_F1 UTL_FILE.FILE_TYPE;
BEGIN
--外层循环得到内层循环BETWEEN的最小值和最大值
FOR J IN (SELECT (LEVEL - 1) * 3000 MINVAL, LEVEL * 3000 MAXVAL
FROM DUAL
CONNECT BY LEVEL <=
(SELECT COUNT(1) FROM ALL_OBJECTS) / 10000 + 1) LOOP
V_F1 := UTL_FILE.FOPEN('UT', 'DATA' || J.MAXVAL || '.TXT', 'W');
--内层循环,获取需要导出的数据
FOR I IN (SELECT T.OWNER, T.OBJECT_NAME
FROM (SELECT ALL_OBJECTS.*,ROW_NUMBER() OVER(ORDER BY OBJECT_NAME) RN FROM ALL_OBJECTS) T
WHERE RN BETWEEN J.MINVAL AND J.MAXVAL) LOOP
--行数据依次写入文件
UTL_FILE.PUT_LINE(V_F1, I.OWNER || I.OBJECT_NAME);
END LOOP;
UTL_FILE.FCLOSE(V_F1);
END LOOP;
END;
1)V_F1 := UTL_FILE.FOPEN('UT', 'DATA' || J.MAXVAL || '.TXT', 'W');语句可以在UT目录下生成文件.
2)UTL_FILE.PUT_LINE(V_F1, I.OWNER || I.OBJECT_NAME); 可以向你的HANDLE写入数据
3)UTL_FILE.FCLOSE(V_F1); 可以用于关闭你持有的文件句柄.其他的都是循环啊,控制了什么的.
FOR I IN (SELECT T.OWNER, T.OBJECT_NAME
FROM (SELECT ALL_OBJECTS.*,ROW_NUMBER() OVER(ORDER BY OBJECT_NAME) RN FROM ALL_OBJECTS) T
WHERE RN BETWEEN J.MINVAL AND J.MAXVAL) LOOP
这个语句就是我自己要查询的语句吗?改成我用的语句
另外问一下,DIRECTORY能否创建excel文件? 如果把V_F1 := UTL_FILE.FOPEN('UT', 'DATA' || J.MAXVAL || '.TXT', 'W'); 这一句里面的.TXT改成 .XLS 行不行?
今天上午刚刚碰到这个问题,就是UTL_FILE操作EXCEL的问题,说句实话,我不知道能否可行.
理论上是不可行的,因为EXCEL和TXT的编码方式毕竟不一样.
去查了下资料库,可以使用Oracle的java存储过程实现,使用UTL_FILE是不可行的.