接昨日!!入门级PL/SQL问题!!今天再送分!!

时间:2022-06-02 22:54:00
现在想实现这个功能,用PL/SQL作一个包,放在服务器上,功能是生成CSV文件

客户端调用包以后,服务器检索数据,然后在服务器端生成CSV文件

在SQL*PLUS中试了一下,客户端可以用SPOOL生成,但是不知道在PL/SQL中怎么使用。

希望高手指点…………

还是很幼稚的问题…………

11 个解决方案

#1


utl_file

#2


SQL> select * from aa;

NAME
--------
20040501
10002000

create or replace procedure wfile
as
type my_cursor is ref cursor;
mycursor my_cursor;
myrecord aa%rowtype;
fileout utl_file.file_type;
begin
fileout := utl_file.fopen('e:\','aa.csv','w');
open mycursor for select * from aa;
loop
  fetch mycursor into myrecord;
  exit when mycursor%notfound;
  utl_file.put_line(fileout,myrecord.name);
end loop;
close mycursor;
utl_file.fclose(fileout);
end;
/

过程已创建

SQL> exec wfile

PL/SQL 过程已成功完成。

E:\>more aa.csv
20040501
10002000

E:\>

#3


得在初始化参数文件里指定UTL_FILE的目录,我是指定了E:\

#4


学习

#5


可以利用utl_file包,但是,在此之前,要注意设置好Utl_file_dir初始化参数
/**************************************************************************
parameter:textContext in varchar2 日志内容
desc: ·写日志,把内容记到服务器指定目录下
·必须配置Utl_file_dir初始化参数,并保证日志路径与Utl_file_dir路径一致或者是其中一个
****************************************************************************/ 
CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2)
IS
file_handle utl_file.file_type;
Write_content VARCHAR2(1024);
Write_file_name VARCHAR2(50);
BEGIN
--open file
write_file_name := 'db_alert.log';
file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
--write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content);
END IF;
--close file
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END sp_Write_log;

#6


如果没有这个目录或者是这个文件呢?会不会新建呢?

盼答

#7


没有这个目录是不行的
没有这个文件是没有关系的
FOPEN有3种打开模式
'w' 如果没有文件,新建,如果有,覆盖
'a' 如果没有文件,新建,如果有,添加数据
'r' 如果没有文件,不能读,如果有,读文件

#8


大家已经说的很详细了,来晚了

#9


DECLARE
fileout utl_file.file_type;
BEGIN
fileout := utl_file.fopen(KEY_FOLDER_PATH,'kaikei.csv','W');


KEY_FOLDER_PATH 是传进来的参数
可以这样写吗?我这样做了,但是还是一到这句后就跳到异常部分
 EXCEPTION 
         WHEN others THEN
          ………………

我在测试的时候,给KEY_FOLDER_PATH 赋值是‘c:\'

#10


能不能报告具体是什么异常阿?

#11


init.ora文件是放在哪里的?我怎一搜索搜索出3个呢?还有一长串数字作为后缀

是不是要在INIT.ORA中添加
UTL_FILE_DIR:=………………
这个参数??

#1


utl_file

#2


SQL> select * from aa;

NAME
--------
20040501
10002000

create or replace procedure wfile
as
type my_cursor is ref cursor;
mycursor my_cursor;
myrecord aa%rowtype;
fileout utl_file.file_type;
begin
fileout := utl_file.fopen('e:\','aa.csv','w');
open mycursor for select * from aa;
loop
  fetch mycursor into myrecord;
  exit when mycursor%notfound;
  utl_file.put_line(fileout,myrecord.name);
end loop;
close mycursor;
utl_file.fclose(fileout);
end;
/

过程已创建

SQL> exec wfile

PL/SQL 过程已成功完成。

E:\>more aa.csv
20040501
10002000

E:\>

#3


得在初始化参数文件里指定UTL_FILE的目录,我是指定了E:\

#4


学习

#5


可以利用utl_file包,但是,在此之前,要注意设置好Utl_file_dir初始化参数
/**************************************************************************
parameter:textContext in varchar2 日志内容
desc: ·写日志,把内容记到服务器指定目录下
·必须配置Utl_file_dir初始化参数,并保证日志路径与Utl_file_dir路径一致或者是其中一个
****************************************************************************/ 
CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2)
IS
file_handle utl_file.file_type;
Write_content VARCHAR2(1024);
Write_file_name VARCHAR2(50);
BEGIN
--open file
write_file_name := 'db_alert.log';
file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
--write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content);
END IF;
--close file
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END sp_Write_log;

#6


如果没有这个目录或者是这个文件呢?会不会新建呢?

盼答

#7


没有这个目录是不行的
没有这个文件是没有关系的
FOPEN有3种打开模式
'w' 如果没有文件,新建,如果有,覆盖
'a' 如果没有文件,新建,如果有,添加数据
'r' 如果没有文件,不能读,如果有,读文件

#8


大家已经说的很详细了,来晚了

#9


DECLARE
fileout utl_file.file_type;
BEGIN
fileout := utl_file.fopen(KEY_FOLDER_PATH,'kaikei.csv','W');


KEY_FOLDER_PATH 是传进来的参数
可以这样写吗?我这样做了,但是还是一到这句后就跳到异常部分
 EXCEPTION 
         WHEN others THEN
          ………………

我在测试的时候,给KEY_FOLDER_PATH 赋值是‘c:\'

#10


能不能报告具体是什么异常阿?

#11


init.ora文件是放在哪里的?我怎一搜索搜索出3个呢?还有一长串数字作为后缀

是不是要在INIT.ORA中添加
UTL_FILE_DIR:=………………
这个参数??