pl/sql读写文件 spool和UTL_FILE package

  1  -- create a table for cursor
  2  drop   table  t_cursor;
  3  create   table  t_cursor(
  4  id  integer   primary   key ,
  5  content  varchar2 ( 20 )
  6  );
  7 
  8  insert   into  t_cursor  values ( 1 , ' first ' );
  9  insert   into  t_cursor  values ( 2 , ' second ' );
 10 
 11  -- my first cursor
 12  set  timing  off ;
 13  set  serveroutput  on ;
 14  set  echo  off              -- 是否显示执行的命令内容  
 15  set  feedback  off         -- 是否显示 *   rows   selected  
 16  set  heading  off          -- 是否显示字段的名称
 17  set  verify  off           -- 是否显示替代变量被替代前后的语句。fil
 18  set  trimspool  off        -- 去字段空格
 19  set  pagesize  1000        -- 页面大小
 20  set  linesize  50 // linesize设定尽量根据需要来设定,大了生成的文件也大
 21  spool  ' d:\test\123.txt ' ; -- spool 是一个sql plus命令,而不是一个pl.sql命令,所以只能在pl/sql块外部使用
 22  declare  
 23  v_out_name  varchar2 ( 20 );
 24  v_out_id  integer ;
 25  CURSOR  my_cursor(v_id  integer is -- declare the cursor, please note here "is" was used.
 26  select  t.id,t.content  from  t_cursor t  where  t.id = v_id;
 27  begin
 28          if  my_cursor % isopen = false  then
 29              open  my_cursor( 1 ); -- open the cursor before using cursor
 30          end   if ;
 31         
 32          fetch  my_cursor  into  v_out_id,v_out_name;
 33          close  my_cursor; -- close the cursor
 34          -- chr(10)chr(13)一个是换行,一个是回车
 35         dbms_output.put_line( ' get name: ' || v_out_name || chr( 13 ) || ' get id: ' || v_out_id);
 36  end ;
 37  /
 38  spool  off ;
 39 
 40 
 41 
 42  -- cursor properties
 43  set  echo  off ;
 44  set  serveroutput  on ;
 45  declare
 46      v_id  integer ;
 47      v_content  varchar2 ( 20 );
 48       cursor  my_cursor_property  IS
 49       select  t.id,t.content  from  t_cursor t;
 50  begin
 51       if  my_cursor_property % isopen = false  then -- cursor%isopen: to judge whether the cursor is open of not
 52           open  my_cursor_property;
 53       end   if ;
 54       fetch  my_cursor_property  into  v_id,v_content;
 55       while  my_cursor_property % found -- cursor%found: the current record is available or not?
 56      loop
 57          dbms_output.put_line( ' the  ' || v_id || '  record: id= ' || v_id || '  name= ' || v_content);
 58           fetch  my_cursor_property  into  v_id,v_content; 
 59          
 60           if  my_cursor_property % rowcount = 2   then
 61              dbms_output.put_line( ' the  ' || v_id || '  record: id= ' || v_id || '  name= ' || v_content);
 62              dbms_output.put_line( ' the row count has reached 2, it will exit. ' );
 63               exit ;
 64           end   if ;
 65       end  loop;
 66       close  my_cursor_property;
 67  end ;
 68  /
 69 
 70  -- cursor record type
 71 
 72  set  serveroutput  on ;
 73  declare
 74      type record_type  is  record
 75      (
 76      v_id t_cursor.id % type,
 77      v_content t_cursor.content % type
 78      );
 79      
 80       cursor  my_cursor_record  is
 81       select   *   from  t_cursor;
 82      
 83      v_info record_type;
 84  begin
 85       if  my_cursor_record % isopen = false  then
 86           open  my_cursor_record;
 87       end   if ;
 88      
 89      loop
 90           fetch  my_cursor_record  into  v_info;
 91           exit   when  my_cursor_record % notfound = true;
 92          
 93          dbms_output.put_line( ' info:  ' || '  id= ' || v_info.v_id || chr( 13 ) || ' content:  ' || v_info.v_content);
 94          
 95       end  loop;
 96      
 97      
 98       close  my_cursor_record;
 99  end ;
100  /
101 
102  --
103  To  accomplish tasks related  to  reading  and  writing files  to  the host operating system, 
104  Oracle includes a pre - defined package called "UTL_FILE."
105 
106  there are two way  to  resolve the reading  and  writing files  in   current  operation system
107  1 ,utl_file_dir -- >init.ora,need to restart the database
108  2 , create  directory dir_name  as   ' c:sample '
109 
110  -- below is a example for create directory
111  1 , grant   create   any  directory  to  scott;(dba)
112  grant   create   any  directory  to   public ;
113  2 , create   or   replace  directory test  as   ' D:\test ' ;
114  3 , GRANT   read , write  ON  DIRECTORY test  TO   PUBLIC ;
115  -- view the registed directories of local file system
116  select   *   from  all_directories;
117 
118  -- http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003526
119  UTL_FILE.FOPEN (
120     location      IN   VARCHAR2 ,
121     filename      IN   VARCHAR2 ,
122     open_mode     IN   VARCHAR2 ,
123     max_linesize  IN  BINARY_INTEGER) 
124     RETURN  file_type;
125    
126  /*
127    location Directory location of file. This string is a directory object name and is case sensitive. 
128    The default is uppercase. 
129    Read privileges must be granted on this directory object for the UTL_FILE user to run FOPEN.
130  */
131 
132  4 ,run the below scripts: 
133  set  serveroutput  on ;
134  declare
135  f utl_file.file_type; -- utl_file package
136  varchar2 ( 200 );
137  begin
138 
139  f : =  utl_file.fopen( ' TEST ' , ' sample.txt ' , ' R ' ); -- TEST should be upper here
140  utl_file.get_line(f,s);
141  /*
142  if s is null then--judge whether is '', we should use 'IS null'
143      dbms_output.put_line('successful');
144  else
145      dbms_output.put_line('failed');
146  end if;
147  */
148  loop
149  if  s  is   null   then -- using "is null"
150  utl_file.get_line(f,s);
151  else
152  exit ;
153  end   if ;
154  end  loop;
155  utl_file.fclose(f);
156  dbms_output.put_line(s);
157 
158 
159  f : =  utl_file.fopen( ' TEST ' , ' sample.txt ' , ' a ' );
160  utl_file.put_line(f,s);
161  utl_file.put_line(f, ' xxx ' );
162  utl_file.fclose(f);
163  end ;
164  /

 

你可能感兴趣的:(package)