1、oracle中设置UTL_FILE_DIR参数 关键字: oracle中设置utl_file_dir参数 第一步:以管理员用户登陆 如:conn sys/password@sid as sysdba 第二步:设置可操作目录 需要指定utl_file包可以操作的目录。在oracle 10g以前,可以用以下方法: 1、alter system set utl_file_dir='e:\utl' scope=spfile; 2、在init.ora文件中,配置如下:
2、 UTL_FILE=E:\utl或者UTL_FILE_DIR=E:\utl 在oracle 10g中建议用以下方法配置:CREATE DIRECTORY utl AS 'E:\utl'; 参见oracle online: In the past, accessible directories for the UTL_FILE functions were specified in the initialization file
3、 using the UTL_FILE_DIR parameter. However, UTL_FILE_DIR access is not recommended. It is recommended that you use the CREATE DIRECTORY feature, which replaces UTL_FILE_DIR. Directory objects offer more flexibility a
4、nd granular control to the UTL_FILE application administrator, can be maintained dynamically (that is, without shutting down the database), and are consistent with other Oracle tools. CREATE DIRECTORY privilege is
5、 granted only to SYS and SYSTEM by default. 第三步:授权给指定用户,以便执行utl_file GRANT EXECUTE ON utl_file TO scott; 第四步:conn scott/tiger 就可以正常使用utl_file了。 摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O
6、操作。 文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件, 那么就需要使用I/O接口把数据导入到数据库中来。在 PL/SQL中没有直接的I/O接口, 一般在调试程序时可以使用Oracle自带的DBMS_OUTPUT包的put_line函数(即向屏幕进行I/O 操作)即可, 但是对于磁盘文件的I/O操作它就无能为力了。其实Oracle同样也提供了可以进行文件I/O的实用包-----UTL_FILE包, 利用这
7、个实用包提供的函数来实现对磁盘的I/O操作。 1. 准备工作 由于Oracle数据库对包创建的目录有一个安全管理的问题,所以并不是所有的文件目录能够被UTL_FILE包所访问, 要更新这种目录设置,就得到init.ora里将UTL_FILE_DIR域设置为*,这样UTL_FILE包就可以对所有的目录文件进行访问了。 2. 文件I/O的实施 UTL_FILE包提供了很多实用的函数来进行I/O操作,主要有以下几个函数:
8、 fopen 打开指定的目录路径的文件。 get_line 获取指定文件的一行的文本。 put_line 向指定的文件写入一行文本。 fclose 关闭指定的文件。 下面利用这些函数,实现从文件取数据,然后将数据写入到相应的数据库中。 create or replace procedure load
9、filedata(p_path varchar2,p_filename varchar2) as v_filehandle utl_file.file_type; --定义一个文件句柄 v_text varchar2(100); --存放文本 v_name test_loadfile.name%type; v_addr_jd test_loadfile.addr_jd%type; v_region test_loadfile.region%type;
10、v_firstlocation number; v_secondlocation number; v_totalinserted number; begin if (p_path is null or p_filename is null) then goto to_end; end if; v_totalinserted:=0; /*open specified file*/ v
11、filehandle:=utl_file.fopen(p_path,p_filename,'r'); loop begin utl_file.get_line(v_filehandle,v_text); exception when no_data_found then exit; end v_firstlocation:=instr(v_text,',',1,1); v_secondlocation:=instr(v_text,',',1,2);
12、 v_name:=substr(v_text,1,v_firstlocation-1); v_addr_jd:=substr(v_text,v_firstlocation+1,v_secondlocation-v_firstlocation-1); v_region:=substr(v_text,v_secondlocation+1); /*插入数据库操作*/ insert into test_loadfile values (v_name,v_addr_jd,v_region);
13、commit;
end loop;
<
14、reate any directory to scott; grant create any library to scott; create or replace directory utllobdir as 'C:\ep'; 在initsid.ora文件中,加入或修改 设置utl_file_dir的要点: 1。 utl_file_dir=* 这表示你能操作任何目录,尽量不要用
15、 2。 utl_file_dir=d:\ 这表示你能操作d:\目录下的文件,但你不能操作d:\目录下的子目录 3。注意在设置 utl_file_dir=路径时,如果路径是长路径名,例如c:\my temp目录,则你必须加上'',例如: utl_file_dir='c:\my temp' 4。utl_file_dir可以是多个路径 utl_file_dir=c:\,d:\,d:\temp,'c:\my temp' 5。设置
16、完必须重新启动数据库 本文描述了Sun Solaris上运行Oracle数据库所需要设置的一些内核参数。 一些预备知识 shared memory:共享内存段: 一个内存区域,可以被不同的进程读取。Oracle使用它来构成SGA。Oracle使用以下三种方法来创建一个SGA区: 1.使用单个共享内存段。 2.使用连续多个共享内存段。 3.使用多个不连续共享内存段。 Oracle优先使用的第一种方法,如果成功,则继续初始化,不成功则使用第二种方法,再不成功则使用第三种方法。如果再不成功,则初始化失败,Oracle报告错误代码。 S
17、emaphore:(信号量) 可以看作一个标记。可以有On和Off两种状态。Oracle使用semaphores来实现服务器进程对SGA区的存取控制。 Shared memory 和semaphore 是Oracle在Unix上运行的重要资源。如果Oracle 实例得不到所需要的资源,实例启动就会失败。 参数: 对于运行一个Oracle实例的Solaris系统,改变/etc/system文件中的一些关于共享内存的参数,以使Oracle实例可以正常运行。如果有多个实例的话,还需根据下面方法重新计算某些值。 共享内存: shmmax 含义:这个设
18、置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。max shared memory segment size (SHMMAX) bytes 设置方法:0.5*物理内存 例子:Set shmsys:shminfo_shmmax=10485760 shmmin 含义:共享内存的最小大小。 设置方法:一般都设置成为1。 例子:Set shmsys:shminfo_shmmin=1: shmmni 含义:系统中共享内存段的最大个数。 例子:Set shmsys:shminfo_
19、shmmni=100 shmseg 含义:每个用户进程可以使用的最多的共享内存段的数目。 例子:Set shmsys:shminfo_shmseg=20: 信号量: semmni 含义:系统范围内设置信号量集的最大数目. UNIX将信号量分配到个信号量集.分配的信号量数目的范围为1到semmsl参数所设置的值. 设置方法:固定 例子:Set semsys:seminfo_semmni=100 semmsl: 含义:一个set中semaphore的最大个数。系统范围内信号量集中信号量的数目. 设置方法:设置成为10+所有Oracle实例的I
20、nitSID.ora中最大的Processes的值。 例子:Set semsys:seminfo_semmsl=200 semmns 含义:系统中semaphores的最大个数。 设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Oracle实例的个数。 例子:Set semsys:seminfo_semmns=200 semopm set semsys:seminfo_semopm=100 semvmx set semsys:seminfo_semvmx=32767 改变了/etc/system里边以上参数以后,重新启动计算机: $reboot 然后检查当前的参数: $sysdef -I 如果系统参数仍旧没有改变得话,使用以下命令: $modload /kernel/sys/shmsys。"






