Перейти к содержанию
Fire Monkey от А до Я
  • 0

Синтаксис запроса к БД Oracle


Олег Киреев

Вопрос

Здравствуйте уважаемые члены сообщества.

Пожалуйста. Подскажите где ошибка в синтаксисе запроса к БД Oracle  в котором мне надо из указанного пользователем поля отдела выбрать данные в промежутке дат. Ранее обращаясь к  Access я дел так:

var Ot,Doo: Integer;

  Ot:=Trunc(bsSkinDateEdit7.Date);
  Doo:=Trunc(bsSkinDateEdit8.Date);

  Query1.Active:=False;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM Tab_Izv where Otdel like '+#39+ bsSkinComboBox1.Text+ '%' +#39+
                   ' AND Data between '+ inttostr(Ot)+' and '+inttostr(Doo) +' ORDER BY Nomer'  );
  Query1.Active:=True;

и все отлично работает но вот к Oracle так не получается пробую так:

var Ot,Doo: String;

  Ot:=bsSkinDateEdit7.Text;
  Doo:=bsSkinDateEdit8.Text;

  Query1.Active:=False;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * Tab_Izv where OTDEL like '+#39+ bsSkinComboBox1.Text+ '%' +#39+
                   ' AND DATA between (to_char('+ Ot+','+''''+'dd.mm.yyyy'+''''+')) and (to_char('+ Doo+','+''''+'dd.mm.yyyy'+''''+')) ORDER BY NOMER'  );
  Query1.Active:=True;

Ругается на пропуск оператора. Где же ошибка???

С Уважением. Олег.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Попробуй сделать запрос с параметрами:

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := 'SELECT *'
                   + '  FROM Tab_Izv'
                   + ' WHERE Otdel like :OTDEL'
                   + '   AND Data between :DATE1 and :DATE2'
                   + ' ORDER BY Nomer';
  Query1.ParamByName('OTDEL').AsString := bsSkinComboBox1.Text+ '%';
  Query1.ParamByName('DATE1').AsDate := bsSkinDateEdit7.Date;
  Query1.ParamByName('DATE2').AsDate := bsSkinDateEdit8.Date;
  Query1.Open;

 

Ссылка на комментарий
  • 0

Попробуйте

Query1.SQL.Add('SELECT *
FROM Tab_Izv 
WHERE OTDEL like '+#39+bsSkinComboBox1.Text+'%'+#39+
' AND DATA BETWEEN TO_DATE ('+ Ot+', "dd.mm.yyyy") AND TO_DATE ('+ Doo+', "dd.mm.yyyy") ORDER BY NOMER;' );

 

В 28.08.2017 в 19:03, gelo1 сказал:

Query1.SQL.Add('SELECT * Tab_Izv where OTDEL like '+#39+ bsSkinComboBox1.Text+ '%' +#39+
                   ' AND DATA between (to_char('+ Ot+','+''''+'dd.mm.yyyy'+''''+')) and (to_char('+ Doo+','+''''+'dd.mm.yyyy'+''''+')) ORDER BY NOMER'  );

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Прекрасно.

Потом база даных опять меняется и вы насиживаете себе ... ну скажем сутулость, выискивая в разросшемся проекте всевозможные SQL запросы содержащие в параметрах даты. И это ещё хорошо если проект был написан вами.

;)

Ссылка на комментарий
  • 0
В 28.08.2017 в 21:13, galex сказал:

Попробуй сделать запрос с параметрами:


  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := 'SELECT *'
                   + '  FROM Tab_Izv'
                   + ' WHERE Otdel like :OTDEL'
                   + '   AND Data between :DATE1 and :DATE2'
                   + ' ORDER BY Nomer';
  Query1.ParamByName('OTDEL').AsString := bsSkinComboBox1.Text+ '%';
  Query1.ParamByName('DATE1').AsDate := bsSkinDateEdit7.Date;
  Query1.ParamByName('DATE2').AsDate := bsSkinDateEdit8.Date;
  Query1.Open;

 

Здравствуйте galex.

Попробовал. При выполнении ругается " table does not exist". Хотя на гриде вся таблица загружается. Что делать?

С Уважением. Олег.

Ссылка на комментарий
  • 0
В 29.08.2017 в 08:30, Rusland сказал:

Попробуйте


Query1.SQL.Add('SELECT *
FROM Tab_Izv 
WHERE OTDEL like '+#39+bsSkinComboBox1.Text+'%'+#39+
' AND DATA BETWEEN TO_DATE (Ot, "dd.mm.yyyy") AND TO_DATE (Doo, "dd.mm.yyyy") ORDER BY NOMER;' );

 

 

Здравствуйте Rusland.

Обратите внимание что Ot и Doo это переменные. В запросе в скобках ' ' они участвуют как в прямом запросе. При выполнении запроса ругается "capability not supported". Что делать?

С Уважением. Олег.

Ссылка на комментарий
  • 0
28 минут назад, gelo1 сказал:

Здравствуйте galex.

Попробовал. При выполнении ругается " table does not exist". Хотя на гриде вся таблица загружается. Что делать?

С Уважением. Олег.

Здавствуйте gelo1.

Пример для вас я собирал на коленке и сожалению очень мало данных для анализа ошибки. Но попробуем.
1. Возможно не хватает указания схемы. 

Т.е. вам необходимо попробовать изменить запрос на 

SELECT * FROM PUBLIC.Tab_Izv

если таблица находиться в схеме PUBLIC.

Возникает ли ошибка если вы выполните запрос 

SELECT * FROM Tab_Izv

в вашем Adminnistration Tool? (Кстати что вы для этого используете?)

2. Проверьте настойки соединения с базой в вашем приложении.

Кстати какие компоненты для подключения к базе вы используете: FireDAC/UniDAC/ZEOSLib/BDE???

Ну вот пока вроде и все...

Как я и сказал слишком мало данных для анализа.

С Уважением
galex

Ссылка на комментарий
  • 0
В 30.08.2017 в 12:19, galex сказал:

Здавствуйте gelo1.

Пример для вас я собирал на коленке и сожалению очень мало данных для анализа ошибки. Но попробуем.
1. Возможно не хватает указания схемы. 

Т.е. вам необходимо попробовать изменить запрос на 


SELECT * FROM PUBLIC.Tab_Izv

если таблица находиться в схеме PUBLIC.

Возникает ли ошибка если вы выполните запрос 


SELECT * FROM Tab_Izv

в вашем Adminnistration Tool? (Кстати что вы для этого используете?)

2. Проверьте настойки соединения с базой в вашем приложении.

Кстати какие компоненты для подключения к базе вы используете: FireDAC/UniDAC/ZEOSLib/BDE???

Ну вот пока вроде и все...

Как я и сказал слишком мало данных для анализа.

С Уважением
galex

СпасиБО за ответ.

1.На простой запрос

SELECT * FROM Tab_Izv всё срабатывает. А что даёт команда PUBLIC ?

2.Использую старинное BDE. Все запросы кроме тех в которых есть поля дат отлично срабатывают. А вот с датами у меня загвоздка. Поставить приложение менеджера у меня нет прав администратора. Работаю на ощупь.

С Уважением. Олег.

 

 

Ссылка на комментарий
  • 0

Я так и не понял в чем была проблема, но рад что все заработало.

Олег, может отпишете как проблема в конечном итоге была решена - возможно кому-нибудь еще поможет :)

С уважением
galex

Ссылка на комментарий
  • 0

Здравствуйте galex.

СпасиБО за ответ.

Я вместо старого кода который в самом начале писал ввёл этот:

Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := 'SELECT *'
                   + '  FROM SGKA_TAB_IZV'
                   + ' WHERE OTDEL like :OTDEL'
                   + '   AND DATA between :DATE1 and :DATE2'
                   + ' ORDER BY NOMER';
  Query1.ParamByName('OTDEL').AsString := bsSkinComboBox1.Text+ '%';
  Query1.ParamByName('DATE1').AsDate := bsSkinDateEdit7.Date;
  Query1.ParamByName('DATE2').AsDate := bsSkinDateEdit8.Date;
  Query1.Open;

Ну и заработало. Наверное надо было через параметры делать запрос.

Можно ещё вопрос?

У меня совсем нет опыта в oracle. Теперь естественно научившись делать выборки на научится вставлять строки, редактировать и удалять. Я пробую это делать так:

//вставка в 2 полей:

  Query1.Insert;
  Query1.FieldByName('NOMER').AsString:=bsSkinEdit1.Text;
  Query1.FieldByName('DATA').AsString:=bsSkinDateEdit1.Text;
  Query1.Post;

Визуально видно в таблице что вставилось но после перезагрузки запроса пропадает.

или sql запросом:

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := 'INSERT INTO SGKA_TAB_IZV (NOMER,DATA) VALUES ('+#39+ bsSkinEdit1.Text+#39+','+#39+ bsSkinDateEdit1.Text+#39+')';
  Query1.Open;

Ругается что таблица только для чтения. Хотя в oracle она открыта на редактирование, удаление и вставку.

Посоветуйте что делать?

С Уважением. Олег.

Ссылка на комментарий
  • 0
18 часов назад, gelo1 сказал:

Query1.SQL.Text := 'INSERT INTO SGKA_TAB_IZV (NOMER,DATA) VALUES ('+#39+ bsSkinEdit1.Text+#39+','+#39+ bsSkinDateEdit1.Text+#39+')';
  Query1.Open;

Как-то не вяжется INSERT и Open, может  лучше ExecSQL использовать?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...