我正在使用Oracle 6i Form 表单是搜索表单,它有许多用于条件搜索的文本项 并且有命令按钮 按下时,表格将显示所有记录 如果用户在creteria文本项中选择了一些项,则结果将被过滤 根据这些标准 现在完成了,然后我想使用以下代码将结果导出到文本文件
OUTFILE TEXT_IO.FILE_TYPE;
filename varchar2(100);
sql_string varchar2(8000);
a number(10);
begin
a := 0;
if :norm.Dob_fr is not null and :norm.Dob_to is not null then
sql_string := sql_string || ' (DATE_FROM >= to_date(''' || to_char(:norm.Dob_fr,'YYYY-MM-DD') || ''',''YYYY-MM-DD'') and date_to <= to_date(''' || to_char(:norm.Dob_to,'YYYY-MM-DD') || ''',''YYYY-MM-DD'')';
a := 1;
end if;
if :norm.per_fr is not null and :norm.per_to is not null then
if a = 1 then
sql_where := ' and ';
else
sql_where := ' ( ';
a := 1;
end if;
sql_string := sql_string || sql_where || ' pay_date >= to_date(''' || to_char(:norm.per_fr,'YYYY-MM-DD') || ''',''YYYY-MM-DD'') and pay_date <= to_date(''' || to_char(:norm.per_to,'YYYY-MM-DD') || ''',''YYYY-MM-DD'')';
end if;
sql_string := sql_string || ' ) ';
FOR SE IN ('select * from V_BILL_TRAN where ' || nvl(sql_string,'1=1') loop
导出代码运行良好,但是我的问题在上面显示的最后一条语句中,其中where语句“ sql_string:它可能包含或不包含数据 那么该代码不会被oracle 6i形式接受 有什么问题
答案 0 :(得分:0)
这是错误的:
sql_string := sql_string || ' ) ';
右括号引起问题,因为-即使sql_string
中没有任何内容,在连接括号后,sql_string
也将变成)
,并且在下一条语句中会引起问题({ {1}}循环),因为FOR
无效-结果将
nvl(sql_string, 1=1)
代替
select * from V_BILL_TRAN where )
将其重写为
select * from V_BILL_TRAN where 1=1
答案 1 :(得分:0)
这是初始代码
OUTFILE TEXT_IO.FILE_TYPE;
filename varchar2(100);
sql_string varchar2(8000);
a number(10);
begin
a := 0;
if :norm.Dob_fr is not null and :norm.Dob_to is not null then
sql_string := sql_string || ' (DATE_FROM >= to_date(''' || to_char(:norm.Dob_fr,'YYYY-MM-DD') || ''',''YYYY-MM-DD'') and date_to <= to_date(''' || to_char(:norm.Dob_to,'YYYY-MM-DD') || ''',''YYYY-MM-DD'')';
a := 1;
end if;
if :norm.per_fr is not null and :norm.per_to is not null then
if a = 1 then
sql_where := ' and ';
else
sql_where := ' ( ';
a := 1;
end if;
sql_string := sql_string || sql_where || ' pay_date >= to_date(''' || to_char(:norm.per_fr,'YYYY-MM-DD') || ''',''YYYY-MM-DD'') and pay_date <= to_date(''' || to_char(:norm.per_to,'YYYY-MM-DD') || ''',''YYYY-MM-DD'')';
end if;
sql_string := sql_string || ' ) ';
FOR SE IN ('select * from V_BILL_TRAN where ' || nvl(sql_string,'1=1') loop