选择带变量的查询

时间:2019-05-10 11:57:39

标签: oracle oracleforms

我正在使用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形式接受 有什么问题

2 个答案:

答案 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