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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 43

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

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
uranic2

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

Цитата:
то есть средствами PL\SQL не решается

можно просто средствами SQL
 
and
((Z is nul)  or (t.f3 = Z))

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 10:36 02-05-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Столкнулся со странным поведением курсора. По номеру клиента есть 10 записей - запрос из курсора возвращает именно это количество. А вот с выполнением курсора какая-то непонятка - он так же возвращает 10 записей, но одна из записей задвоена, в результате чего одна запись в выборку не попадает.
 
P.S. Переделал цикл - вроде все ок. Но окончательной уверенности нет

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, тут у меня неслабо так пригорело после общения с разработчиками - они ни в какую не хотят ставить внешние ключи в таблицах. Я не пойму - это так невероятно сложно или как-то влияет на производительность системы? WTF?!
Схема сравнительно небольшая - около 100 таблиц. И нет ни одной, с**а, связи!

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 09:57 10-05-2018 | Исправлено: NiXXX, 10:09 10-05-2018
uranic2

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

Цитата:
Комрады, тут у меня неслабо так пригорело после общения с разработчиками - они ни в какую не хотят ставить внешние ключи в таблицах. Я не пойму - это так невероятно сложно или как-то влияет на производительность системы? WTF?!  
Схема сравнительно небольшая - около 100 таблиц. И нет ни одной, с**а, связи!

 
Слабаки!  
 
А если серьезно, то хоть какая СУБД? Например, для postgresql имеет смысл, если нагруженная СУБД, то проще модифицировать структуру БД (с FK будут временные блокировки на все связанные таблицы).  
 
 
 
 
 
 
Добавлено:
На мой взгляд, от FK намного больше пользы, чем вреда

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 15:47 10-05-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про FK в postgres и блокировки читал, но в жизни столкнуться не приходилось.
Я на оракле сижу.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 17:04 10-05-2018
uranic2

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

Цитата:
Про FK в postgres и блокировки читал, но в жизни столкнуться не приходилось.  
Я на оракле сижу

 
Ну на Oracle тоже DDL операции на нагруженных БД даром не даются. Помнится у нас была проблема с перекомпиляцией всех зависимых программных объектов от таблицы (пакеты, процедуры и т.п.), что могло привести к блокировке глобальной. Увы, с оралом уже 5 лет серьезно не работаем, - на postrgres перешли.

Всего записей: 297 | Зарегистр. 17-08-2004 | Отправлено: 07:49 11-05-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 43

Компьютерный форум 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