1. UTL_FILE 提供了在操作系统层面上对文件系统中文件的读写功能。非超级用户在使用包UTL_FILE中任何函数或存储过程前必须由超级用户授予在这个包上的EXECUTE权限。例如:我们使用下列命令对用户mary进行授权:
  2.  
  3. GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary;
  4. 如果使用包UTL_FILE中的函数和存储过程访问文件,那么操作系统中的用户enterprisedb必须在要访问的目录和文件上有相应的读写权限。如果没有相应权限的话,在执行包UTL_FILE中函数或存储过程的时候,就会产生异常。
  5.  
  6. 在引用文件的时候,要使用到一个文件句柄,来表示对文件的读或写。文件句柄是通过包 UTL_FILE中名称为UTL_FILE.FILE_TYPE的公有变量来定义的。我们必须声明一个类型为FILE_TYPE的变量来接收通过函数 FOPEN返回的文件句柄。这个文件句柄将用于随后在文件上的所有操作。
  7.  
  8. 对于文件系统上目录的引用是通过使用目录名称,或者由CREATE DIRECTORY命令为目录分配的化名来实现的。
  9.  
  10. 下面的表中列出了包UTL_FILE中允许使用的存储过程和函数。
  11.  
  12. 7-44 在包UTL_FILE中允许使用的函数/存储过程
  13.  
  14. 函数/存储过程
  15.  
  16. 返回类型
  17.  
  18. 描述
  19.  
  20. FCLOSE(file IN OUT)
  21.  
  22. n/a
  23.  
  24. 关闭由参数file所指定的文件。
  25.  
  26. FCLOSE_ALL
  27.  
  28. n/a
  29.  
  30. 关闭所有打开的文件。
  31.  
  32. FCOPY(location, filename, dest_dir, dest_file [, start_line [, end_line ] ])
  33.  
  34. n/a
  35.  
  36. 将指定目录location中文件filename代拷贝到目录dest_dir中的文件dest_file,要拷贝的文件内容范围是从参数start_line开始,到end_line结束。
  37.  
  38. FFLUSH(file)
  39.  
  40. n/a
  41.  
  42. 强制将缓冲区中的数据写到由参数file标识的磁盘文件上。
  43.  
  44. FOPEN(location, filename, open_mode [, max_linesize ])
  45.  
  46. FILE_TYPE
  47.  
  48. 打开目录location下,文件名为filename的文件。
  49.  
  50. FREMOVE(location, filename)
  51.  
  52. n/a
  53.  
  54. 从文件系统中删除指定的文件。
  55.  
  56. FRENAME(location, filename, dest_dir, dest_file [, overwrite ])
  57.  
  58. n/a
  59.  
  60. 更改指定文件的名称。
  61.  
  62. GET_LINE(file, buffer OUT)
  63.  
  64. n/a
  65.  
  66. 从参数file指定的文件中把一行文本读到变量,缓冲区中。
  67.  
  68. IS_OPEN(file)
  69.  
  70. BOOLEAN
  71.  
  72. 确定指定文件是否已经打开。
  73.  
  74. NEW_LINE(file [, lines ])
  75.  
  76. n/a
  77.  
  78. 将行结束符写到文件中。
  79.  
  80. PUT(file, buffer)
  81.  
  82. n/a
  83.  
  84. 将缓冲区buffer的内容写到指定文件中。存储过程PUT不写入行结束符。
  85.  
  86. PUT_LINE(file, buffer)
  87.  
  88. n/a
  89.  
  90. 将缓冲区buffer的内容写到指定文件中,存储过程PUTL_LINE会在文件中写入行结束符。
  91.  
  92. PUTF(file, format [, arg1 ] [, ...])
  93.  
  94. n/a
  95.  
  96. 将格式化的字符串写入指定文件中。我们可以最多可以指定5个可替代参数(从arg1arg5)在参数format进行替换。
  97.  
  98. 7.4.1 FCLOSE
  99. 存储过程FCLOSE关闭一个已打开的文件。
  100.  
  101. FCLOSE(file
  102.  
  103. IN OUT FILE_TYPE)
  104. 参数
  105.  
  106. file
  107.  
  108. 一个类型为FILE_TYPE的变量,包含一个要被关闭的文件的句柄。
  109.  
  110. 7.4.2 FCLOSE_ALL
  111. 存储过程FCLOSE_ALL关闭所有已打开的文件。如果没有需要关闭的文件,存储过程也会执行成功。
  112.  
  113. FCLOSE_ALL
  114. 7.4.3 FCOPY
  115. 存储过程FCOPY把一个文件中文本拷贝到另外一个文件中。
  116.  
  117. FCOPY(location
  118.  
  119. VARCHAR2, filename
  120.  
  121. VARCHAR2,
  122.  
  123. dest_dir
  124.  
  125. VARCHAR2, dest_file
  126.  
  127. VARCHAR2
  128.  
  129. [, start_line
  130.  
  131. PLS_INTEGER [, end_line
  132.  
  133. PLS_INTEGER ] ])
  134. 参数
  135.  
  136. location
  137.  
  138. 表示目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要拷贝的文件。
  139.  
  140. filename
  141.  
  142. 要拷贝文件的名称。
  143.  
  144. dest_dir
  145.  
  146. 表示目录名称,存放在pg_catalog.edb_dir.dirname中,是源文件要拷贝到目的目录。
  147.  
  148. dest_file
  149.  
  150. 目标文件的名称。
  151.  
  152. start_line
  153.  
  154. 源文件中文本行号,用于指定开始拷贝的位置。缺省值是1
  155.  
  156. end_line
  157.  
  158. 源文件中最后一行要拷贝文本的行号。如果省略这个参数或者这个参数为空,那么就一直拷贝到文件中最后一行。
  159.  
  160. 示例
  161.  
  162. 下面的示例中产生文件 c:/temp/empdir/empfile.csv的拷贝。这个文件中包含一个逗号分隔的列表,内容是表emp中的雇员信息。然后列出了empcopy.csv的内容。
  163.  
  164. CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR';
  165.  
  166. DECLARE
  167.  
  168. v_empfile UTL_FILE.FILE_TYPE;
  169.  
  170. v_src_dir VARCHAR2(50) := 'empdir';
  171.  
  172. v_src_file VARCHAR2(20) := 'empfile.csv';
  173.  
  174. v_dest_dir VARCHAR2(50) := 'empdir';
  175.  
  176. v_dest_file VARCHAR2(20) := 'empcopy.csv';
  177.  
  178. v_emprec VARCHAR2(120);
  179.  
  180. v_count INTEGER := 0;
  181.  
  182. BEGIN
  183.  
  184. UTL_FILE.FCOPY(v_src_dir,v_src_file,v_dest_dir,v_dest_file);
  185.  
  186. v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
  187.  
  188. DBMS_OUTPUT.PUT_LINE('The following is the destination file, ''' ||
  189.  
  190. v_dest_file || '''');
  191.  
  192. LOOP
  193.  
  194. UTL_FILE.GET_LINE(v_empfile,v_emprec);
  195.  
  196. DBMS_OUTPUT.PUT_LINE(v_emprec);
  197.  
  198. v_count := v_count + 1;
  199.  
  200. END LOOP;
  201.  
  202. EXCEPTION
  203.  
  204. WHEN NO_DATA_FOUND THEN
  205.  
  206. UTL_FILE.FCLOSE(v_empfile);
  207.  
  208. DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
  209.  
  210. WHEN OTHERS THEN
  211.  
  212. DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
  213.  
  214. DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
  215.  
  216. END;
  217.  
  218. The following is the destination file, 'empcopy.csv'
  219.  
  220. 7369,SMITH,CLERK,7902,17-DEC-80,800,,20
  221.  
  222. 7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
  223.  
  224. 7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30
  225.  
  226. 7566,JONES,MANAGER,7839,02-APR-81,2975,,20
  227.  
  228. 7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30
  229.  
  230. 7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30
  231.  
  232. 7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10
  233.  
  234. 7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20
  235.  
  236. 7839,KING,PRESIDENT,,17-NOV-81,5000,,10
  237.  
  238. 7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30
  239.  
  240. 7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20
  241.  
  242. 7900,JAMES,CLERK,7698,03-DEC-81,950,,30
  243.  
  244. 7902,FORD,ANALYST,7566,03-DEC-81,3000,,20
  245.  
  246. 7934,MILLER,CLERK,7782,23-JAN-82,1300,,10
  247.  
  248. 14 records retrieved
  249. 7.4.4 FFLUSH
  250. 存储过程FFLUSH强制将缓冲区中未写入磁盘的内容写到磁盘文件中,并将缓冲区的内容清空。
  251.  
  252. FFLUSH(file
  253.  
  254. FILE_TYPE)
  255. 参数
  256.  
  257. file
  258.  
  259. 包含一个文件句柄的变量,类型为FILE_TYPE
  260.  
  261. 示例
  262.  
  263. 调用存储过程NEW_LINE后,将缓冲区中的每一行记录强制写到磁盘中。
  264.  
  265. DECLARE
  266.  
  267. v_empfile UTL_FILE.FILE_TYPE;
  268.  
  269. v_directory VARCHAR2(50) := 'empdir';
  270.  
  271. v_filename VARCHAR2(20) := 'empfile.csv';
  272.  
  273. CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
  274.  
  275. BEGIN
  276.  
  277. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
  278.  
  279. FOR i IN emp_cur LOOP
  280.  
  281. UTL_FILE.PUT(v_empfile,i.empno);
  282.  
  283. UTL_FILE.PUT(v_empfile,',');
  284.  
  285. UTL_FILE.PUT(v_empfile,i.ename);
  286.  
  287. UTL_FILE.PUT(v_empfile,',');
  288.  
  289. UTL_FILE.PUT(v_empfile,i.job);
  290.  
  291. UTL_FILE.PUT(v_empfile,',');
  292.  
  293. UTL_FILE.PUT(v_empfile,i.mgr);
  294.  
  295. UTL_FILE.PUT(v_empfile,',');
  296.  
  297. UTL_FILE.PUT(v_empfile,i.hiredate);
  298.  
  299. UTL_FILE.PUT(v_empfile,',');
  300.  
  301. UTL_FILE.PUT(v_empfile,i.sal);
  302.  
  303. UTL_FILE.PUT(v_empfile,',');
  304.  
  305. UTL_FILE.PUT(v_empfile,i.comm);
  306.  
  307. UTL_FILE.PUT(v_empfile,',');
  308.  
  309. UTL_FILE.PUT(v_empfile,i.deptno);
  310.  
  311. UTL_FILE.NEW_LINE(v_empfile);
  312.  
  313. UTL_FILE.FFLUSH(v_empfile);
  314.  
  315. END LOOP;
  316.  
  317. DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
  318.  
  319. UTL_FILE.FCLOSE(v_empfile);
  320.  
  321. END;
  322. 7.4.5 FOPEN
  323. 函数FOPENI/O操作打开一个文件。
  324.  
  325. filetype
  326.  
  327. FILE_TYPE FOPEN(location
  328.  
  329. VARCHAR2, filename
  330.  
  331. VARCHAR2,
  332.  
  333. open_mode
  334.  
  335. VARCHAR2 [, max_linesize
  336.  
  337. BINARY_INTEGER ])
  338. 参数
  339.  
  340. location
  341.  
  342. 目录名称,存在pg_catalog.edb_dir.dirname中。这个目录包含着要打开的文件。
  343.  
  344. filename
  345.  
  346. 被打开文件的名称。
  347.  
  348. open_mode
  349.  
  350. 打开文件需要的模式。可允许的模式包括: a-向文件添加内容;r-从文件读取内容;w - 向文件写内容。
  351.  
  352. max_linesize
  353.  
  354. 一行文本的最大长度,以字符为单位。在读模式中,如果试图读取一行长度超过max_linesize的值,那么会产生异常。在写模式和附加模式中, 如果尝试写一行长度超过max_linesize的文本,那么也会产生异常。当计算文本行是否超出最大行长度时,不包含行结束符。这种系统行为与 Oracle不兼容。-Oracle在做相同操作时是计算行结束符的。
  355.  
  356. filetype
  357.  
  358. 类型为FILE_TYPE的变量,包含被打开文件句柄。
  359.  
  360. 7.4.6 FREMOVE
  361. 存储过程FREMOVE用于从系统中删除一个文件。
  362.  
  363. FREMOVE(location
  364.  
  365. VARCHAR2, filename
  366.  
  367. VARCHAR2)
  368. 如果要删除的文件不存在,那么会产生一个异常。
  369.  
  370. 参数
  371.  
  372. location
  373.  
  374. 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要删除的文件。
  375.  
  376. filename
  377.  
  378. 要删除文件的名称。
  379.  
  380. 示例
  381.  
  382. 下面的示例删除了文件 empfile.csv
  383.  
  384. DECLARE
  385.  
  386. v_directory VARCHAR2(50) := 'empdir';
  387.  
  388. v_filename VARCHAR2(20) := 'empfile.csv';
  389.  
  390. BEGIN
  391.  
  392. UTL_FILE.FREMOVE(v_directory,v_filename);
  393.  
  394. DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename);
  395.  
  396. EXCEPTION
  397.  
  398. WHEN OTHERS THEN
  399.  
  400. DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
  401.  
  402. DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
  403.  
  404. END;
  405.  
  406. Removed file: empfile.csv
  407. 7.4.7 FRENAME
  408. 存储过程FRENAME修改一个文件的名称,这样我们可以把一个文件从一个位置移动到另外一个位置。
  409.  
  410. FRENAME(location
  411.  
  412. VARCHAR2, filename
  413.  
  414. VARCHAR2,
  415.  
  416. dest_dir
  417.  
  418. VARCHAR2, dest_file
  419.  
  420. VARCHAR2, [ overwrite
  421.  
  422. BOOLEAN ])
  423. 参数
  424.  
  425. location
  426.  
  427. 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要改名的文件。
  428.  
  429. filename
  430.  
  431. 要改名的源文件名称。
  432.  
  433. dest_dir
  434.  
  435. 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录是被改名文件所在的目录。
  436.  
  437. dest_file
  438.  
  439. 原始文件的新名称。
  440.  
  441. overwrite
  442.  
  443. 如果设置为”true”,在dest_dir 目录中覆盖任何名为dest_file 的文件。若设置为”false”,就会产生异常。这是缺省情况。
  444.  
  445. 示例
  446.  
  447. 下面我们将文件C:/TEMP/EMPDIR/empfile.csv重新命名,这个文件包含一个逗号分隔的列表,内容是表emp中雇员的信息。然后列出重新命名后的文件 C:/TEMP/NEWDIR/newemp.csv的内容。
  448.  
  449. CREATE DIRECTORY "newdir" AS 'C:/TEMP/NEWDIR';
  450.  
  451. DECLARE
  452.  
  453. v_empfile UTL_FILE.FILE_TYPE;
  454.  
  455. v_src_dir VARCHAR2(50) := 'empdir';
  456.  
  457. v_src_file VARCHAR2(20) := 'empfile.csv';
  458.  
  459. v_dest_dir VARCHAR2(50) := 'newdir';
  460.  
  461. v_dest_file VARCHAR2(50) := 'newemp.csv';
  462.  
  463. v_replace BOOLEAN := FALSE;
  464.  
  465. v_emprec VARCHAR2(120);
  466.  
  467. v_count INTEGER := 0;
  468.  
  469. BEGIN
  470.  
  471. UTL_FILE.FRENAME(v_src_dir,v_src_file,v_dest_dir,
  472.  
  473. v_dest_file,v_replace);
  474.  
  475. v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
  476.  
  477. DBMS_OUTPUT.PUT_LINE('The following is the renamed file, ''' ||
  478.  
  479. v_dest_file || '''');
  480.  
  481. LOOP
  482.  
  483. UTL_FILE.GET_LINE(v_empfile,v_emprec);
  484.  
  485. DBMS_OUTPUT.PUT_LINE(v_emprec);
  486.  
  487. v_count := v_count + 1;
  488.  
  489. END LOOP;
  490.  
  491. EXCEPTION
  492.  
  493. WHEN NO_DATA_FOUND THEN
  494.  
  495. UTL_FILE.FCLOSE(v_empfile);
  496.  
  497. DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
  498.  
  499. WHEN OTHERS THEN
  500.  
  501. DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
  502.  
  503. DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
  504.  
  505. END;
  506.  
  507. The following is the renamed file, 'newemp.csv'
  508.  
  509. 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
  510.  
  511. 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
  512.  
  513. 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
  514.  
  515. 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
  516.  
  517. 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
  518.  
  519. 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
  520.  
  521. 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
  522.  
  523. 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
  524.  
  525. 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
  526.  
  527. 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
  528.  
  529. 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
  530.  
  531. 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
  532.  
  533. 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
  534.  
  535. 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
  536.  
  537. 14 records retrieved
  538. 7.4.8 GET_LINE
  539. 存储过程GET_LINE从一个指定文件中读取一行不包含行结束符的文本。如果在文件中已经没有文本行可供读取的话,那么会产生名为NO_DATA_FOUND的异常。
  540.  
  541. GET_LINE(file
  542.  
  543. FILE_TYPE, buffer
  544.  
  545. OUT VARCHAR2)
  546. 参数
  547.  
  548. file
  549.  
  550. 类型为FILE_TYPE的变量,包含已打开文件句柄的变量。
  551.  
  552. buffer
  553.  
  554. 用于接收文件中文本行的变量。
  555.  
  556. 示例
  557.  
  558. 下面这个匿名代码块,读取并显示了文件empfile.csv中记录。
  559.  
  560. DECLARE
  561.  
  562. v_empfile UTL_FILE.FILE_TYPE;
  563.  
  564. v_directory VARCHAR2(50) := 'empdir';
  565.  
  566. v_filename VARCHAR2(20) := 'empfile.csv';
  567.  
  568. v_emprec VARCHAR2(120);
  569.  
  570. v_count INTEGER := 0;
  571.  
  572. BEGIN
  573.  
  574. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'r');
  575.  
  576. LOOP
  577.  
  578. UTL_FILE.GET_LINE(v_empfile,v_emprec);
  579.  
  580. DBMS_OUTPUT.PUT_LINE(v_emprec);
  581.  
  582. v_count := v_count + 1;
  583.  
  584. END LOOP;
  585.  
  586. EXCEPTION
  587.  
  588. WHEN NO_DATA_FOUND THEN
  589.  
  590. UTL_FILE.FCLOSE(v_empfile);
  591.  
  592. DBMS_OUTPUT.PUT_LINE('End of file ' || v_filename || ' - ' ||
  593.  
  594. v_count || ' records retrieved');
  595.  
  596. WHEN OTHERS THEN
  597.  
  598. DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
  599.  
  600. DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
  601.  
  602. END;
  603.  
  604. 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
  605.  
  606. 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
  607.  
  608. 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
  609.  
  610. 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
  611.  
  612. 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
  613.  
  614. 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
  615.  
  616. 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
  617.  
  618. 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
  619.  
  620. 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
  621.  
  622. 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
  623.  
  624. 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
  625.  
  626. 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
  627.  
  628. 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
  629.  
  630. 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
  631.  
  632. End of file empfile.csv - 14 records retrieved
  633. 7.4.9 IS_OPEN
  634. 函数IS_OPEN用来确认指定文件是否已打开。
  635.  
  636. status
  637.  
  638. BOOLEAN IS_OPEN(file
  639.  
  640. FILE_TYPE)
  641. 参数
  642.  
  643. file
  644.  
  645. 类型为FILE_TYPE的变量,包含被测试文件的句柄。
  646.  
  647. status
  648.  
  649. 如果指定文件已打开,那么返回”true”,否则返回”false”。
  650.  
  651. 7.4.10 NEW_LINE
  652. 向一个包含双倍行距的雇员记录列表写入行结束符。
  653.  
  654. NEW_LINE(file
  655.  
  656. FILE_TYPE [, lines
  657.  
  658. INTEGER ])
  659. 参数
  660.  
  661. file
  662.  
  663. 类型为FILE_TYPE的变量,包含要写入行结束符的文件句柄。
  664.  
  665. lines
  666.  
  667. 要写入的行结束符的数量。缺省是1
  668.  
  669. 示例
  670.  
  671. 向一个包含双倍行距的雇员记录列表写入行结束符。
  672.  
  673. DECLARE
  674.  
  675. v_empfile UTL_FILE.FILE_TYPE;
  676.  
  677. v_directory VARCHAR2(50) := 'empdir';
  678.  
  679. v_filename VARCHAR2(20) := 'empfile.csv';
  680.  
  681. CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
  682.  
  683. BEGIN
  684.  
  685. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
  686.  
  687. FOR i IN emp_cur LOOP
  688.  
  689. UTL_FILE.PUT(v_empfile,i.empno);
  690.  
  691. UTL_FILE.PUT(v_empfile,',');
  692.  
  693. UTL_FILE.PUT(v_empfile,i.ename);
  694.  
  695. UTL_FILE.PUT(v_empfile,',');
  696.  
  697. UTL_FILE.PUT(v_empfile,i.job);
  698.  
  699. UTL_FILE.PUT(v_empfile,',');
  700.  
  701. UTL_FILE.PUT(v_empfile,i.mgr);
  702.  
  703. UTL_FILE.PUT(v_empfile,',');
  704.  
  705. UTL_FILE.PUT(v_empfile,i.hiredate);
  706.  
  707. UTL_FILE.PUT(v_empfile,',');
  708.  
  709. UTL_FILE.PUT(v_empfile,i.sal);
  710.  
  711. UTL_FILE.PUT(v_empfile,',');
  712.  
  713. UTL_FILE.PUT(v_empfile,i.comm);
  714.  
  715. UTL_FILE.PUT(v_empfile,',');
  716.  
  717. UTL_FILE.PUT(v_empfile,i.deptno);
  718.  
  719. UTL_FILE.NEW_LINE(v_empfile,2);
  720.  
  721. END LOOP;
  722.  
  723. DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
  724.  
  725. UTL_FILE.FCLOSE(v_empfile);
  726.  
  727. END;
  728.  
  729. Created file: empfile.csv
  730. 然后显示这个文件的内容:
  731.  
  732. C:/TEMP/EMPDIR>TYPE empfile.csv
  733.  
  734. 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
  735.  
  736. 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
  737.  
  738. 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
  739.  
  740. 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
  741.  
  742. 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
  743.  
  744. 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
  745.  
  746. 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
  747.  
  748. 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
  749.  
  750. 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
  751.  
  752. 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
  753.  
  754. 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
  755.  
  756. 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
  757.  
  758. 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
  759.  
  760. 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
  761. 7.4.11 PUT
  762. 存储过程PUT将一行字符串写入一个文件中。在字符串结尾的行结束符不会写入到文件中。我们可以使用存储过程NEW_LINE在文件中增加行结束符。
  763.  
  764. PUT(file
  765.  
  766. FILE_TYPE, buffer
  767.  
  768. { DATE | NUMBER | TIMESTAMP |
  769.  
  770. VARCHAR2 })
  771. 参数
  772.  
  773. file
  774.  
  775. 类型为FILE_TYPE的变量,包含一个文件句柄,字符串将写到这个文件中。
  776.  
  777. buffer
  778.  
  779. 要写入指定文件中的文本。
  780.  
  781. 示例
  782.  
  783. 下面的示例使用存储过程PUT创建了一个逗号分隔的列表,列表的内容是表emp中的雇员信息。
  784.  
  785. DECLARE
  786.  
  787. v_empfile UTL_FILE.FILE_TYPE;
  788.  
  789. v_directory VARCHAR2(50) := 'empdir';
  790.  
  791. v_filename VARCHAR2(20) := 'empfile.csv';
  792.  
  793. CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
  794.  
  795. BEGIN
  796.  
  797. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
  798.  
  799. FOR i IN emp_cur LOOP
  800.  
  801. UTL_FILE.PUT(v_empfile,i.empno);
  802.  
  803. UTL_FILE.PUT(v_empfile,',');
  804.  
  805. UTL_FILE.PUT(v_empfile,i.ename);
  806.  
  807. UTL_FILE.PUT(v_empfile,',');
  808.  
  809. UTL_FILE.PUT(v_empfile,i.job);
  810.  
  811. UTL_FILE.PUT(v_empfile,',');
  812.  
  813. UTL_FILE.PUT(v_empfile,i.mgr);
  814.  
  815. UTL_FILE.PUT(v_empfile,',');
  816.  
  817. UTL_FILE.PUT(v_empfile,i.hiredate);
  818.  
  819. UTL_FILE.PUT(v_empfile,',');
  820.  
  821. UTL_FILE.PUT(v_empfile,i.sal);
  822.  
  823. UTL_FILE.PUT(v_empfile,',');
  824.  
  825. UTL_FILE.PUT(v_empfile,i.comm);
  826.  
  827. UTL_FILE.PUT(v_empfile,',');
  828.  
  829. UTL_FILE.PUT(v_empfile,i.deptno);
  830.  
  831. UTL_FILE.NEW_LINE(v_empfile);
  832.  
  833. END LOOP;
  834.  
  835. DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
  836.  
  837. UTL_FILE.FCLOSE(v_empfile);
  838.  
  839. END;
  840.  
  841. Created file: empfile.csv
  842. 下面是上面创建文件empfile.csv的内容:
  843.  
  844. C:/TEMP/EMPDIR>TYPE empfile.csv
  845.  
  846. 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
  847.  
  848. 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
  849.  
  850. 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
  851.  
  852. 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
  853.  
  854. 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
  855.  
  856. 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
  857.  
  858. 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
  859.  
  860. 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
  861.  
  862. 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
  863.  
  864. 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
  865.  
  866. 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
  867.  
  868. 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
  869.  
  870. 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
  871.  
  872. 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
  873. 7.4.12 PUT_LINE
  874. 存储过程PUT_LINE 向指定文件写入一行包含行结束符的文本。
  875.  
  876. PUT_LINE(file
  877.  
  878. FILE_TYPE, buffer
  879.  
  880. { DATE | NUMBER | TIMESTAMP |
  881.  
  882. VARCHAR2 })
  883. 参数
  884.  
  885. file
  886.  
  887. 类型为FILE_TYPE的变量,包含一个文件的句柄。文本记录将写到这个文件中。
  888.  
  889. buffer
  890.  
  891. 要写入指定文件中的文本。
  892.  
  893. 示例
  894.  
  895. 在下面的示例中,使用存储过程PUT_LINE创建了一个包含以逗号分隔列表的文件,内容是表emp中的雇员信息。
  896.  
  897. DECLARE
  898.  
  899. v_empfile UTL_FILE.FILE_TYPE;
  900.  
  901. v_directory VARCHAR2(50) := 'empdir';
  902.  
  903. v_filename VARCHAR2(20) := 'empfile.csv';
  904.  
  905. v_emprec VARCHAR2(120);
  906.  
  907. CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
  908.  
  909. BEGIN
  910.  
  911. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
  912.  
  913. FOR i IN emp_cur LOOP
  914.  
  915. v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
  916.  
  917. NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
  918.  
  919. ',' || i.sal || ',' ||
  920.  
  921. NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
  922.  
  923. UTL_FILE.PUT_LINE(v_empfile,v_emprec);
  924.  
  925. END LOOP;
  926.  
  927. DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
  928.  
  929. UTL_FILE.FCLOSE(v_empfile);
  930.  
  931. END;
  932. 下面就是上面创建的empfile.csv中内容:
  933.  
  934. C:/TEMP/EMPDIR>TYPE empfile.csv
  935.  
  936. 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
  937.  
  938. 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
  939.  
  940. 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
  941.  
  942. 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
  943.  
  944. 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
  945.  
  946. 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
  947.  
  948. 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
  949.  
  950. 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
  951.  
  952. 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
  953.  
  954. 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
  955.  
  956. 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
  957.  
  958. 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
  959.  
  960. 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
  961.  
  962. 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
  963. 7.4.13 PUTF
  964. 存储过程PUTF向文件写入一个格式化的字符串。
  965.  
  966. PUTF(file
  967.  
  968. FILE_TYPE, format
  969.  
  970. VARCHAR2 [, arg1
  971.  
  972. VARCHAR2]
  973.  
  974. [, ...])
  975. 参数
  976.  
  977. file
  978.  
  979. 类型为FILE_TYPE的变量,包含文件句柄。我们将把格式化的文本记录写到这个参数指向的文件。
  980.  
  981. format
  982.  
  983. 用于写入文件的文本字符串格式。可以使用参数arg替代指定的字符串序列%s。指定的字符串序列/n表示新的一行。然而,要注意的是在 Postgres Plus Advanced Server中,必须以2个连续的反斜线而不是一个-//n来指定换行符。这个特性与Oracle不兼容。
  984.  
  985. arg1
  986.  
  987. 最多可以有5个参数arg1...arg5 来替代格式字符串中出现的每个%s.按照第一个arg用于替代第一个出现的%s,第二个arg用于替代第二个%s。。这样的顺序进行替代。
  988.  
  989. 示例
  990.  
  991. 在下面的匿名代码块中产生了包含表emp中数据的格式化输出。需要注意的是E文本语法和格式字符串中出现的双反斜线不属于Oracle兼容特性。
  992.  
  993. DECLARE
  994.  
  995. v_empfile UTL_FILE.FILE_TYPE;
  996.  
  997. v_directory VARCHAR2(50) := 'empdir';
  998.  
  999. v_filename VARCHAR2(20) := 'empfile.csv';
  1000.  
  1001. v_format VARCHAR2(200);
  1002.  
  1003. CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
  1004.  
  1005. BEGIN
  1006.  
  1007. v_format := E'%s %s, %s//nSalary: $%s Commission: $%s//n//n';
  1008.  
  1009. v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
  1010.  
  1011. FOR i IN emp_cur LOOP
  1012.  
  1013. UTL_FILE.PUTF(v_empfile,v_format,i.empno,i.ename,i.job,i.sal,
  1014.  
  1015. NVL(i.comm,0));
  1016.  
  1017. END LOOP;
  1018.  
  1019. DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
  1020.  
  1021. UTL_FILE.FCLOSE(v_empfile);
  1022.  
  1023. EXCEPTION
  1024.  
  1025. WHEN OTHERS THEN
  1026.  
  1027. DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
  1028.  
  1029. DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
  1030.  
  1031. END;
  1032.  
  1033. Created file: empfile.csv
  1034. 下面就是上面所创建的文件empfile.csv的内容:
  1035.  
  1036. C:/TEMP/EMPDIR>TYPE empfile.csv
  1037.  
  1038. 7369 SMITH, CLERK
  1039.  
  1040. Salary: $800.00 Commission: $0
  1041.  
  1042. 7499 ALLEN, SALESMAN
  1043.  
  1044. Salary: $1600.00 Commission: $300.00
  1045.  
  1046. 7521 WARD, SALESMAN
  1047.  
  1048. Salary: $1250.00 Commission: $500.00
  1049.  
  1050. 7566 JONES, MANAGER
  1051.  
  1052. Salary: $2975.00 Commission: $0
  1053.  
  1054. 7654 MARTIN, SALESMAN
  1055.  
  1056. Salary: $1250.00 Commission: $1400.00
  1057.  
  1058. 7698 BLAKE, MANAGER
  1059.  
  1060. Salary: $2850.00 Commission: $0
  1061.  
  1062. 7782 CLARK, MANAGER
  1063.  
  1064. Salary: $2450.00 Commission: $0
  1065.  
  1066. 7788 SCOTT, ANALYST
  1067.  
  1068. Salary: $3000.00 Commission: $0
  1069.  
  1070. 7839 KING, PRESIDENT
  1071.  
  1072. Salary: $5000.00 Commission: $0
  1073.  
  1074. 7844 TURNER, SALESMAN
  1075.  
  1076. Salary: $1500.00 Commission: $0.00
  1077.  
  1078. 7876 ADAMS, CLERK
  1079.  
  1080. Salary: $1100.00 Commission: $0
  1081.  
  1082. 7900 JAMES, CLERK
  1083.  
  1084. Salary: $950.00 Commission: $0
  1085.  
  1086. 7902 FORD, ANALYST
  1087.  
  1088. Salary: $3000.00 Commission: $0
  1089.  
  1090. 7934 MILLER, CLERK
  1091.  
  1092. Salary: $1300.00 Commission: $0

  

UTL_FILE详解的更多相关文章

  1. sqlldr详解

    Oracle 的SQL*LOADER可以将外部数据加载到数据库表中.下面是SQL*LOADER的基本特点: 1)能装入不同数据类型文件及多个数据文件的数据2)可装入固定格式,自由定界以及可度长格式的数 ...

  2. Oracle 10g Data Pump Expdp/Impdp 详解

    Data Pump 介绍 在第一部分看了2段官网的说明, 可以看出数据泵的工作流程如下: (1)在命令行执行命令 (2)expdp/impd 命令调用DBMS_DATAPUMP PL/SQL包. 这个 ...

  3. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  4. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  8. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  9. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

随机推荐

  1. java 静态方法和实例方法的区别

    转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...

  2. f2fs解析(八)node 管理器中的node_info

    free_info 功成身退,node_info顺利接班. // 这里还是蛮复杂的一件事,如果不搞清除的话,这个历史性的接班工作我们就接不上 上面说到 alloc_nid 和 alloc_nid_do ...

  3. 关于js中onclick字符串传参问题

    规则: 外变是“”,里面就是‘’外边是‘’,里边就是“”   示例: var a="111"; var html="<a onclick='selecthoods( ...

  4. Win2008R2配置WebDeploy

    一.配置服务器 1.安装管理服务 2.点击管理服务进行配置 3.安装WebDeploy 3.1通过离线安装包方式安装: https://www.iis.net/downloads/microsoft/ ...

  5. 携手K2 BPM,华住酒店完美实现“互联网+”转型

    华住酒店集团,旗下6大品牌酒店,包括商旅品牌—禧玥酒店.全季酒店.星程酒店.汉庭酒店.海友酒店,以及度假品牌—漫心度假酒店.高端大气上档次一气呵成,2013年签约K2,携手成就美好生活. 演讲人:宋洪 ...

  6. JS调试加断点

    js在回调函数执行时直接就跳过了,想看下回调函数也看不了,调试的debug代码一时半会儿想不起来,找了几分钟找到了,还是记一下好. 1 debugger;

  7. HTTP协议简介2

    几个相关的知识点: 客户端发送请求时,请求类型为GET与POST的主要差别是什么? 1.请求类型不同,一个为GET,一个为POST 2.当请求类型为GET时,请求的数据以参数的形式添加到url的后面, ...

  8. Android EventBus源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  9. [git]图解git常用命令

    本文图解git中最常用的命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提 ...

  10. [CareerCup] 2.7 Palindrome Linked List 回文链表

    2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome ...