oracle用PLSQL把表数据写到excel的例子(UTL_FILE)

  

oracle用PLSQL把表数据写到excel的例子(UTL_FILE)

 

这里有个例子﹐不过不是结果﹐而是指定的table.你可以参考一下。

CREATE OR REPLACE PROCEDURE pro_Datatoexcel(

/*

 写出前需建立文件目录

CREATE OR REPLACE DIRECTORY

my_dir AS

'D:/aa'

赋权限给执行的用户

GRANT WRITE,READ ON DIRECTORY my_dir TO exam0701b

*/

   p_table IN VARCHAR2,

   p_path   IN VARCHAR2,

   p_file   IN VARCHAR2)

AS

   TYPE t_refcur   IS REF CURSOR ;       --定义游标变量

   v_fetchrow     t_refcur ;              --实例化

   v_cursor    INTEGER;

   v_sqlstatement VARCHAR2(100);

   v_colname    VARCHAR2(50);

   v_cols       VARCHAR2(500);

   v_data       VARCHAR2(500);

   v_describeinfo DBMS_SQL.DESC_TAB;

   v_drec       DBMS_SQL.DESC_REC;

   v_returncode INTEGER;

   v_numcolumns INTEGER;

   k              INTEGER:=0;

   v_filehandle UTL_FILE.FILE_TYPE;

BEGIN

   --写标宠则息

   v_cursor:=DBMS_SQL.OPEN_CURSOR;

   v_sqlstatement:='select * from ' || p_table;

   DBMS_SQL.PARSE(v_cursor, v_sqlstatement, dbms_sql.v7);

   DBMS_SQL.DESCRIBE_COLUMNS(v_cursor,   v_numcolumns, v_describeinfo);

   v_filehandle:=UTL_FILE.FOPEN(p_path,p_file,'w');

   FOR v_col IN 1..v_numcolumns LOOP

v_drec:=v_describeinfo(v_col);

v_cols:=v_cols||RPAD(v_drec.col_name, 16)||CHR(9);

   END LOOP;

   UTL_FILE.PUT(v_filehandle,v_cols) ;

 

   --获取总行数

   EXECUTE IMMEDIATE 'select count(*) from '|| p_table

   INTO k;

 

   --读取数据

   --先从行开始﹐再从列开始

   FOR i IN 1..k LOOP

   FOR v_col IN 1..v_numcolumns LOOP

      v_drec:=v_describeinfo(v_col);

   v_colname:=v_drec.col_name;

   OPEN v_fetchrow FOR 'select '||v_colname||' from (select '||p_table||'.*,rownum rk from '||p_table||' ) where rk ='||i;

   FETCH v_fetchrow INTO v_cols;

      v_data:=v_data||v_cols;

   v_data:=v_data||CHR(9);

   END LOOP;

 

   UTL_FILE.NEW_LINE(v_filehandle,1);

   UTL_FILE.PUT(v_filehandle,v_data) ;

   v_data :='';

   UTL_FILE.FFLUSH(v_filehandle) ;

   END LOOP;   

 

   UTL_FILE.FCLOSE(v_filehandle);   

   EXCEPTION

   WHEN UTL_FILE.INVALID_PATH THEN

RAISE_APPLICATION_ERROR(-20002,'ORA-错误﹐无效的文件路径!') ;

   WHEN UTL_FILE.INVALID_MODE THEN

RAISE_APPLICATION_ERROR(-20002,'ORA-错误﹐指定的文件模式无效!') ;

   WHEN UTL_FILE.WRITE_ERROR THEN

RAISE_APPLICATION_ERROR(-20002,'ORA-错误﹐在写操作时发生操作系统错误!') ;

   WHEN OTHERS THEN

IF UTL_FILE.IS_OPEN(v_filehandle) THEN      

   UTL_FILE.FCLOSE(v_filehandle);            

END IF;

RAISE_APPLICATION_ERROR(-20002,'产生转档文件失败﹐请联系程序开发人员!') ;

END;


Oracle 数据库中,可以使用 PL/SQL 开发语言来导入 Excel 数据。具体步骤如下: 1. 将 Excel 数据另存为 CSV 格式的文件。 2. 在 PL/SQL 开发工具中,如 SQL Developer,创建一个新表来存储 CSV 文件中的数据。表中的列需要与 CSV 文件中的列对应。 3. 在 PL/SQL 开发工具中,创建一个存储过程来导入 CSV 文件中的数据到新表中。可以使用 UTL_FILE 包来读取 CSV 文件中的数据,并使用 INSERT 语句将数据插入到新表中。 4. 在存储过程中,需要指定 CSV 文件中的列与新表中的列对应,以及数据类型和格式。 5. 在存储过程中,可以使用异常处理来处理导入过程中出现的错误。 6. 在 PL/SQL 开发工具中,执行存储过程,将 CSV 文件中的数据导入到新表中。 7. 完成导入后,可以在新表中查看导入的数据。 下面是一个简单的 PL/SQL 存储过程示例,用于将 CSV 文件中的数据导入到新表中: ``` CREATE OR REPLACE PROCEDURE import_csv_data IS -- 定义变量 v_file UTL_FILE.FILE_TYPE; v_dir VARCHAR2(100); v_filename VARCHAR2(100); v_buffer VARCHAR2(4000); -- 指定新表名和列名 v_table_name VARCHAR2(100) := 'import_data'; v_col1 VARCHAR2(100) := 'col1'; v_col2 VARCHAR2(100) := 'col2'; BEGIN -- 指定 CSV 文件所在的目录和文件名 v_dir := 'DIR_TEMP'; v_filename := 'data.csv'; -- 打开 CSV 文件 v_file := UTL_FILE.FOPEN(v_dir, v_filename, 'r', 32767); -- 循环读取 CSV 文件中的每一行数据 LOOP -- 读取一行数据 UTL_FILE.GET_LINE(v_file, v_buffer); -- 如果读取到的数据为空,退出循环 EXIT WHEN v_buffer IS NULL; -- 使用逗号分隔符将数据分割成多个字段 v_col1_value := SUBSTR(v_buffer, 1, INSTR(v_buffer, ',')-1); v_col2_value := SUBSTR(v_buffer, INSTR(v_buffer, ',')+1); -- 将数据插入到新表中 INSERT INTO v_table_name (v_col1, v_col2) VALUES (v_col1_value, v_col2_value); END LOOP; -- 关闭文件 UTL_FILE.FCLOSE(v_file); -- 提交事务 COMMIT; EXCEPTION -- 处理异常 WHEN OTHERS THEN -- 输出错误信息 DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); -- 回滚事务 ROLLBACK; END; ``` 在执行存储过程之前,需要先创建一个新表,用于存储 CSV 文件中的数据。可以使用以下 SQL 语句创建一个名为 import_data 的新表: ``` CREATE TABLE import_data ( col1 VARCHAR2(100), col2 VARCHAR2(100) ); ``` 在执行存储过程之前,还需要创建一个目录对象,用于指定 CSV 文件所在的目录。可以使用以下 SQL 语句创建一个名为 DIR_TEMP 的目录对象: ``` CREATE OR REPLACE DIRECTORY DIR_TEMP AS '/path/to/csv/files'; ``` 在实际应用中,还需要根据实际情况修改存储过程和 SQL 语句中的表名、列名、目录名和文件名等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值