使用ORACLE中的另一个过程调用过程

时间:2014-01-08 14:47:15

标签: sql oracle relational-database

我正在尝试使用第二个程序调用过程。第一个过程将创建一个文件,而第二个过程将为游标中的每个记录调用第一个过程。我希望的结果是每个记录都有一个单独的文件。当我运行该过程时,它将在文件上创建并生成以下错误:

ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at "PS.EXPORT_PROC", line 30
ORA-06512: at "PS.LOOP_EXPORT_PROC2", line 15
ORA-06512: at line 2
Process exited.

第一个程序如下:

create or replace
PROCEDURE      "EXPORT_PROC"
(Psectionid number)

is
output_file_one     utl_file.file_type;

--------------------------------------------------------------

Cursor Crs is
select s.student_number student_number, s.lastfirst as student_name, 
cc.expression, c.course_name, t.lastfirst,
ps_customfields.getstudentscf(s.id,'blend_learn_score') grade
from
cc join courses c
on cc.course_number=c.course_number
join students s 
on cc.studentid=s.id
join teachers t
on cc.teacherid=t.id
where cc.termid in (2300,2301,2302)
and cc.sectionid IN(30024,30065, 30276, 30064, 30052)
and s.enroll_status=0;


-----------------------------------------------------------------
Begin


For rec in Crs LOOP
output_file_one := utl_file.fopen ( 'BLENDED_LEARNING',  rec.lastfirst || '-' || 
rec.expression || '-' || rec.course_name || '.txt' , 'W');
utl_file.putF (output_file_one, 'Student_Number' || chr(9) || 'Student_Name'||chr(9)||'Grade'); 
utl_file.fflush(output_File_one);

END LOOP;

For rec in Crs  LOOP
utl_file.put_line (output_file_one, rec.student_number || chr(9) || rec.student_name || 
chr(9) || REC.grade);
utl_file.fflush(output_file_one);
End Loop;

utl_file.fclose(output_file_one);

END;

第二个程序应该将值传递给第一个

create or replace
PROCEDURE LOOP_EXPORT_PROC2 

IS 

Cursor Blended_Crs  is

select distinct sectionid
from cc
inner join courses a on cc.course_number = a.course_number
where cc.termid >= 2300 and a.course_name like ('AR%') and cc.schoolid = 3;

BEGIN
For rec in Blended_Crs  LOOP

EXPORT_PROC(rec.sectionid);

End Loop;

END LOOP_EXPORT_PROC2;

它应循环并在第二个过程中为crs2中的每个记录创建一个文件,但在运行该过程时,它将成功创建一个文件并生成顶部列出的错误。

我已验证目录的权限是否正确。

我的问题是你能想到我会得到这个错误的任何理由吗?根据代码,它应该能够为第二个过程游标中的每个记录运行一次第一个过程。我这样做是为了让我可以将不同的周长传递到第一个程序中,并为每个周边设置不同的文件。

1 个答案:

答案 0 :(得分:0)

您有几个语法错误。例如:

select distinct FIELD4
from 
where perimeter1=TRUE, perimeter2 in (1,2,3);

应该是

select distinct FIELD4
from 
where perimeter1=TRUE AND perimeter2 in (1,2,3);

这里缺少分号:

Cursor crs is
    select field1 , field2, field3
      from table1 

你没有在这里正确关闭你的外环:

For rec in crs LOOP
    output_file_one := utl_file.fopen ( 'DIRECTORY',  'file.txt' , 'W');
    For rec in crs LOOP
      utl_file.put_line (output_file_one, rec.field1 || chr(9) || 
                         rec.field2 || chr(9) || REC.field3);
    End Loop;
    utl_file.fclose(output_file_one);

您需要先调查源代码中的编译错误,然后才能在此处发布问题。使用show errors编译后,您可以查看错误。