Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
применение функции к этому полю таблицы препятствует использованию индекса по нему

Естественно.

Цитата:
Думаю, как из getdate() с помощью бубна и какой-то матери собрать дату с временем 19:00

так например dateadd(hour, 19, convert(datetime, convert(date, getdate())))

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 13:43 26-01-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Из GETDATE() легко можно получить смещение на 19 часов в прошлое используя DATEADD() и отрицательное число второго аргумента...
 
Добавлено:
Alexzzy
опоздал... Но ничего вложенный конверт не нужен - уж лучше NOW() использовать

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 13:50 26-01-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обнаружил затупы в работе процедуры, причем непонятно в какой момент и по какой причине они возникают. Решил протестить эту процедуру под нагрузкой (JMeter). И столкнулся с внезапной проблемой... я без понятия как вызвать процедуру и передать в нее параметры! В PL\SQL Developer данная операция как-то не вызывала затруднений - контекстное меню всегда выручало
Пример процедуры.
Пробую begin tiger.pkg_test.crcall(через запятую передаю параметры); end; - не взлетает от слова совсем. Например pidcall должен возвращаться после выполнения процедуры, а не передаваться в качестве переменной.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:59 30-01-2018 | Исправлено: NiXXX, 19:00 30-01-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha
1. Смещение в прошлое на 19 здесь нафиг не нужно, совсем.
2. Нет функции Now()
P.S. Перед тем как писать...

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 21:26 30-01-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
Цитата:
P.S. Перед тем как писать...
ты бы тогда уточнял редакцию и версию Sybase - то что конкретно у тебя нет это еще не обозначает что вообще нет...
И определись с формулировками задачи:

Цитата:
время создания которых больше 19 часов.
и
Цитата:
1. Смещение в прошлое на 19 здесь нафиг не нужно, совсем.
несколько противоречат друг другу...
 
ЗЫ - удачи...
 

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 16:38 31-01-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha
Версия была озвучена. Задачу не я формулировал. Читай лучше.

Цитата:
несколько противоречат друг другу...  

А подумать?

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 20:19 31-01-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может кому будет полезно.
Разобрался с запуском процедуры.
Параметр pidcall был in out. Сработала такая конструкция

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:12 01-02-2018 | Исправлено: NiXXX, 16:13 01-02-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, снова нужна помощь.
Регулярно приходится выполнять одну и ту же операцию поиска истории обработки заявки. Хочу упростить себе жизнь и немного автоматизировать процесс.
Все дерево выглядит так: заявка - наряд - таски.
С заявкой проблем нет объявляю:
declare
v_idcall number(12) := null;  
res_call sd.call%rowtype;
Дальше выбираю в res_call запись по v_idcall. Все ок.
А вот дальше проблема - заявки есть периодические и по ним может быть несколько нарядов, если объявлю
res_wo sd.workorder%rowtype;
то получаю ошибку ORA-01422 "exact fetch returns more than requested number of rows ".  
Такая же беда, если выбирать из таблицы истории обработки наряда - там на каждый наряд по Х строк.
 
Вот во что лучше выбрать несколько строк и как их лучше вывести?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 11:25 08-02-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX, используйте курсор и цикл по нему.

Цитата:
и как их лучше вывести?
Это смотря куда выводить. Если в отдельные таблицы в Дельфи - проще сделать несколько запросов с параметрами. Если одной плоской таблицей в виде истории с упорядочиванием по датам - может быть проще создать 1 запрос соединив 3 таблицы и упорядочив по полю даты.
 

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:48 08-02-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2, запускать буду из PL\SQL Developer, так что вывод думаю сделать в output.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:20 08-02-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Будет примерно так:

Код:
FOR cs IN (SELECT t1.fld1, t2.fld2,... FROM t1, t2,....  WHERE ... ORDER BY ....) LOOP
  dbms_output.put(cs.fld1);
  dbms_output.put_line(cs.fld2);
END LOOP;
cs - курсор
t1, t2,... - ваши таблицы с заявками, нарядами и тасками
t1.fld1, t2.fld2,... - поля для вывода

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 12:27 08-02-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2, благодарю!
Разобрался.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:43 08-02-2018 | Исправлено: NiXXX, 18:15 09-02-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX, при явном объявлении курсора, как в вашем примере, его нужно закрывать:
close wo_cur;
но до того, как вы успеете его закрыть, может возникнуть исключение, и потребуется его обработка в конце процедуры:
...
EXCEPTION
    WHEN OTHERS THEN
      IF wo_cur%ISOPEN THEN CLOSE wo_cur; END IF;
      RAISE;
END;
 
Почему бы вам не упростить код до такого:
Код:
declare  
  v_idcall number(12) := 481;  
begin  
  FOR wo_rec IN (select * from sd.workorder wo where wo.idcall = v_idcall) LOOP
    dbms_output.put_line(wo_rec.fld1||' ,'||wo_rec.fld2);  
  END LOOP;
end;

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 16:14 09-02-2018 | Исправлено: Dronton2, 16:50 09-02-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2, еще раз благодарствую - сам бы не скоро догадался до такого упрощения.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:40 09-02-2018 | Исправлено: NiXXX, 18:43 09-02-2018
Strange_S0u1

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2
Никогда не любил конструкций for wo_rec in (select
 
Как по мне красивее отдельно объявить курсор
 
declare  
  v_idcall number(12) := 481;
  cursor cRec is
    select *
    from sd.workorder wo
    where wo.idcall = v_idcall;
begin  
  FOR wo_rec IN cRec LOOP  
    dbms_output.put_line(wo_rec.fld1||' ,'||wo_rec.fld2);  
  END LOOP;  
end;
 
Код сразу чище становиться. Впрочем дело вкуса конечно.

Всего записей: 6 | Зарегистр. 08-10-2006 | Отправлено: 08:21 08-03-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, вопрос наверное совсем ни о чем, но все же задам.
Из таблицы получаю набор полей, одно из которых типа date, вывожу через dbms_output.put_line. Хочу, чтобы поле типа date вывелось в формате dd.mm.yyyy hh24:mi, но оно упорно выводится в виде DD-MMM-YY. Пробовал задать формат и в запросе и при выводе - как-то безуспешно.
 
Update. Вопрос решился. Сработала конструкция dbms_output.put_line(to_char(sysdate, 'dd.mm.yyyy hh24:mi'));

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:28 13-03-2018 | Исправлено: NiXXX, 18:00 13-03-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго всем времени суток!
Продолжаю свой тернистый путь в освоении sql'я.
В скрипте объявил тип record, надергав в него нужных полей из нескольких таблиц.
Но захотелось большего - хочу вместо перечисления всех полей главной таблицы (их там много) указать scott.t1%rowtype, а дальше добавить дополнительные поля из других таблиц. Придумано -  сделано, но при select t1.*, t2.status_name into v_call from t1 left join t2... получаю ошибку "expression v_call in the INTO list is of wrong type".
 
Update. Сработало на основе курсора.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:13 28-03-2018 | Исправлено: NiXXX, 13:40 29-03-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И снова озадачился вопросом.
Как можно динамически составить запрос? Точнее не весь запрос, а часть с условием where?
Для примера: на вход запрос может принимать три параметра (X,Y,Z), то есть выглядеть следующим образом: select * from t where t.f1 = X and t.f2 = Y and t.f3 = Z. Если параметр Z не задан, то запрос должен стать вида select * from t where t.f1 = X and t.f2 = Y.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 19:08 26-04-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
А при чем тут SQL? Это узконаправленная тривиальная задача формирования SQL запроса. Где и как - информации 0.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 19:45 26-04-2018 | Исправлено: Alexzzy, 20:01 26-04-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy, то есть средствами PL\SQL не решается?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:26 27-04-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru