Выберите запрос с переменной - PullRequest
0 голосов
/ 10 мая 2019

Я работаю с Oracle 6i. Форма - это форма поиска, в ней есть много текстовых элементов для поиска по критериям, и при нажатии есть командная кнопка, форма покажет все записи, выбранные пользователем, некоторые элементы в текстовых элементах creteria,результат будет отфильтрован на основе этих 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: он может содержать или не содержать данные, тогда код не принимается формой оракула 6i, что-то не так

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Это неправильно:

sql_string :=  sql_string  || ' ) ';  

Закрывающая скобка вызывает проблемы, потому что - даже если в sql_string ничего нет, после объединения скобки sql_string станет ), и это вызовет проблемы в следующем операторе (цикл FOR) как nvl(sql_string, 1=1) не вступит в силу - результат будет

select * from V_BILL_TRAN where )

вместо

select * from V_BILL_TRAN where 1=1

Перепишите его на

sql_string := sql_string || case when sql_string is not null then ')' end;
0 голосов
/ 15 мая 2019

это начальный код

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 
...