网上搜索到的文章
http://blog.csdn.net/jiangfeng08/article/details/5718456
http://www.cnblogs.com/OceanChen/archive/2009/02/11/1388185.html
http://cnhnslhs-163-com.iteye.com/blog/1343678
自己的需求 读txt 文件,改变表字段的值
update_customer_rank.txt的格式如下: 13123423126 13123423123 13123423125 13123423121 13123423122
代码如下:
--创建目录 create or replace directory MYFILEDIR as '/unicom-masc'; GRANT READ, WRITE ON DIRECTORY MYFILEDIR TO mascbj; --从文件中读取手机号码更改ibs_customer的rank的值 CREATE OR REPLACE PROCEDURE UPDATE_CUSTOMER_RANK_BYFILE(V_FILEPATH VARCHAR2,--文件路径 V_FILENAME VARCHAR2,--文件名称 V_ROWS OUT NUMBER)--返回处理记录数 AUTHID CURRENT_USER AS V_FILE_HANDLE UTL_FILE.FILE_TYPE; V_SQL VARCHAR2(2000); IS_EXISTS NUMBER(10); MAX_ID NUMBER(10); COL1 VARCHAR2(1000); type c_cursor IS REF CURSOR; c1 c_cursor; --V_ROWS NUMBER(10); BEGIN --创建表 SELECT COUNT(*) INTO IS_EXISTS FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = 'IBS_CUS_RANK_TEMP'; IF IS_EXISTS = 0 THEN V_SQL := 'CREATE TABLE IBS_CUS_RANK_TEMP ( ID INTEGER NOT NULL, Mobile VARCHAR2(20) )'; EXECUTE IMMEDIATE V_SQL; END IF; --创建序列,序列最小值为IBS_CUS_RANK_TEMP表中是最大ID+1 open c1 for 'select nvl(max(id),0)+1 from IBS_CUS_RANK_TEMP'; fetch c1 into MAX_ID; close c1; V_SQL := 'DROP SEQUENCE SEQ_IBS_CUS_RANK_TEMP'; begin EXECUTE IMMEDIATE V_SQL; exception when others then null; end; V_SQL := ' create sequence SEQ_IBS_CUS_RANK_TEMP minvalue '||MAX_ID||' maxvalue 99999999 start with '||MAX_ID||' increment by 1 cache 20'; EXECUTE IMMEDIATE V_SQL; V_FILE_HANDLE := UTL_FILE.FOPEN('MYFILEDIR', V_FILENAME, 'R'); V_ROWS := 0; --处理记录数 LOOP BEGIN --将文件信息读取到COL1中,每次读取一行 UTL_FILE.GET_LINE(V_FILE_HANDLE, COL1); --取序列值 open c1 for 'select SEQ_IBS_CUS_RANK_TEMP.nextval from dual'; fetch c1 into MAX_ID; close c1; --插入数据 execute immediate 'INSERT INTO IBS_CUS_RANK_TEMP (ID,Mobile) VALUES (:1,:2)' using MAX_ID,substr(COL1,0,LENGTH(COL1)-1); execute immediate 'update ibs_customer set rank=4 where name=:1' using substr(COL1,0,LENGTH(COL1)-1); V_ROWS := V_ROWS + 1; --每5000条提交一次 IF MOD(V_ROWS, 5000) = 0 THEN COMMIT; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; WHEN OTHERS THEN NULL; END; END LOOP; COMMIT; --关闭 UTL_FILE.FCLOSE(V_FILE_HANDLE); --dbms_output.put_line(V_ROWS); END UPDATE_CUSTOMER_RANK_BYFILE; --调用 DECLARE V_ROWS NUMBER(10); BEGIN UPDATE_CUSTOMER_RANK_BYFILE(v_filepath =>'/unicom-masc', v_filename =>'update_customer_rank.txt', v_rows =>v_rows); END;