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

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

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

Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XMLTABLE появился в 10 версии Оракла. Синтаксис: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions228.htm

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:53 03-10-2017
NiXXX



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

Цитата:
Лучше пример XML  
 

Вот пример моего xml.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 21:44 05-10-2017
Mic777

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

Цитата:
Вот пример моего xml.

 
Примерно так тогда.

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 10:00 06-10-2017 | Исправлено: Mic777, 10:26 06-10-2017
NiXXX



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

Цитата:
Примерно так тогда:

Работает! Такой запрос я бы не написал и до второго пришествия
Попробую понять как вместо одного xml пройти по полю, где эти xml лежат.
У меня есть таблица exportlog, с полями id, uid, dtime, xmlin. Надо выбрать все записи, где в поле xmlin DueDt = OrigDt + 1.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:33 06-10-2017
Mic777

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

Цитата:
Попробую понять как вместо одного xml пройти по полю, где эти xml лежат.

 
см. ранее...

Код:
 
  from exportlog t,  
          XMLTABLE(тут путь из последнего запроса  
          passing XMLTYPE(t.xmlin) as "p" если XML в CLOBе
       или без XMLTYPE если XML в поле хранится как XMLType
          passing t.xmlin as "p"
 

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 11:09 06-10-2017
NiXXX



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

Цитата:
см. ранее...  

Земной поклон, боярин!  
Получилось!

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:01 06-10-2017 | Исправлено: NiXXX, 12:04 06-10-2017
Mic777

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

Цитата:
Получилось

можно даты сразу в условие запихнуть, тогда оборачивать селектом не придется
   where to_date(DueDtD || '.' || DueDtM || '.' || DueDtY, 'dd.mm.yyyy') =
             to_date(OrigDtD || '.' || OrigDtM || '.' || OrigDtY, 'dd.mm.yyyy') + 1
 

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 12:42 06-10-2017
NiXXX



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

Цитата:
можно даты сразу в условие запихнуть, тогда оборачивать селектом не придется

Еще плюс много в карму!

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 15:23 06-10-2017 | Исправлено: NiXXX, 15:25 06-10-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скинули мне на почту кусок кода с вопросом "а что он делает".  
Насколько я понял - в цикле выполняет sql_1, пока строки в курсоре не закончатся. Но для себя не понял откуда взялся "= :y"? Понятно, что это p.id из курсора, но нигде не объявлен... Что за зверь такой этот ":y"?

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Читать про EXECUTE IMMEDIATE и передачу параметров!

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 15:12 10-10-2017
NiXXX



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

Цитата:
Читать про EXECUTE IMMEDIATE и передачу параметров!

Почитал, ничего не понял Буду читать дальше.
Заодно закралось подозрение, что sql_2 как-то не участвует в процессе...

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:19 10-10-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я бы больше переживал за commit на каждый чих

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 18:58 10-10-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Объявляется курсор T_CUR
2. В цикле "FOR X IN T_CUR LOOP" текущая выбранная строка курсора записывается в переменную Х
3. "EXECUTE IMMEDIATE sql_1 USING x.id" выполняет запрос, представленный строкой sql_1. Текущее значение x.id подставляется в параметр запроса (:y).
Всю конструкцию можно записать без EXECUTE IMMEDIATE:

Код:
BEGIN  
  FOR X IN (
    select p.id
      from sm.prod p, sm.drom d
      where p.date_in > '01-Feb-2017'  
        and p.date_in < '02-Feb-2017'  
        and p.id = d.idprod  
        and p.idstate = 1003)
  LOOP  
      update sm.drom d
        set d.idstate = 1, d.procdate = trunc(sysdate)
        where d.idprod = x.id;  
      commit;  
  END LOOP;  
END;

COMMIT после каждого UPDATE - нехорошо. В зависимости от количества изменяемых записей, его нужно делать или один раз, или через некоторое количество UPDATEов.
Ещё смущают захардкоженые параметры в SELECTе
И, возможно, подразумевалось, что p.date_in больше или равно, а не просто больше '01-Feb-2017'
А, может быть, всю эту конструкцию можно заменить на единственный UPDATE:

Код:
update sm.drom
  set idstate = 1, procdate = trunc(sysdate)
  where idprod IN (select id
      from sm.prod
      where date_in > '01-Feb-2017'  
        and date_in < '02-Feb-2017'  
        and idstate = 1003)

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:49 11-10-2017 | Исправлено: Dronton2, 10:19 11-10-2017
NiXXX



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

Цитата:
COMMIT после каждого UPDATE - нехорошо. В зависимости от количества изменяемых записей, его нужно делать или один раз, или через некоторое количество UPDATEов.
Ещё смущают захардкоженые параметры в SELECTе
И, возможно, подразумевалось, что p.date_in больше или равно, а не просто больше '01-Feb-2017'

Скорее всего должно быть >=, но что прислали - то прислали
Благодарю за науку.
Попробую избавиться от коммита каждой строки - в declare добавлю n number := 0, а в loop такую конструкцию. Авось взлетит.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:29 11-10-2017 | Исправлено: NiXXX, 11:16 11-10-2017
Dronton2

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

Цитата:
 а в loop такую конструкцию
И ещё один коммит после цикла. (на случай, если количество строк в курсоре не кратно 101)

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:26 11-10-2017 | Исправлено: Dronton2, 11:28 11-10-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть у меня процедура. Вызывается она пользователем из gui, возвращает таблицу данных. А вот вызвать ее из внешней системы как-то не получается...

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 14:43 13-10-2017
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
процедуры не возвращают данных, нужна функция возвращающая таблицу

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 04:49 16-10-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Объяви curRes out sys_refcursor
В odac в файле помощи сделай поиск по sys_refcursor. Там есть  примеры использования курсора в хранимой процедуре.
DenSyo
Если параметр процедуры объявить как OUT или INOUT, то в нём будет возвращаться значение, вычисленное в процедуре.

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2, типа такого? В принципе отрабатывает без ошибок.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 19:06 16-10-2017 | Исправлено: NiXXX, 19:06 16-10-2017
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть запрос в MSSQL:
SELECT foo FROM bar
 
Как получить на выходе не int 291 а сроку "1-2-3", где 1, 2 и 3 младшие 3 нибблы инта?
 
На C такое можно сделать сдвигом на 4:
printf("%X-%X-%X", (i >> 8) & 0xf, (i >> 4) & 0xf, i & 0xf);

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 18:56 17-10-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 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