powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
23 сообщений из 73, страница 3 из 3
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408917
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используй IBExpert.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408922
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx> Учусь не в универе, учусь как раз с книжками.
denixx> Универ, слава богу, в этом году закончил.

Какая разница где, главное результат. :)

denixx> Читал Мартина Грабера, "Понимание SQL", с этим ужасным переводом...
denixx> Если устроюсь работать, куда хочу, куплю бумажную версию

Купи (или скачай, если денег нет) книги "Мир Interbase"
и "Firebird. Руководство разработчика баз данных".

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408928
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxА с ФБ и спрашивать, кроме вас, некого.
Как это "некого"? А Language Reference?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409505
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

Код: plaintext
Просто переучиваться думать из одной СУБД в другую с различающимся синтаксисом, да ещё и не зная толком начал SQL - бяда, бяда

Ну сам SQL не так уж сильно отличается. Различие в основном в ХП.
Я думая, что у тебя и в MySQL эти запросы криво работали
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409798
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисdenixx,
Различие в основном в ХП.

Ну да, я это имел ввиду.

Симонов Денисdenixx,
Я думая, что у тебя и в MySQL эти запросы криво работали
Остальные были однотипные: "вставить или обновить запись, в качестве вывода показать, что произошло".
Последний - вполне возможно.
Но вроде данные выбирал "правильно", на первый взгляд.
HAVING, конечно, сильно упростил задачу.
Проверил только что, вроде эта конструкция не возвращает дубликатов строк.
А в мускуле приходилось в эту околесицу добавлять тот самый GROUP BY e.id или DISTINCT чтобы не выводил одинаковых строк для каждой записи в таблице experience.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409805
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvиспользуй IBExpert.
Собственно, в нём и разрабатывал.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409908
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx> Собственно, в нём и разрабатывал.

Жаловаться на IBE, сравнивая с другими
инструментами, - это просто грех и ересь, ИМХО. :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410638
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY SUBSTRING("Name" FROM  1  FOR  3 ),  10 ;

Код: plaintext
1.
2.
3.
4.
5.
Invalid token.
Dynamic SQL Error.
SQL error code = - 104 .
Invalid command.
invalid ORDER BY clause.

В мускуле, опять же, прокатывало, отображало сначала сгруппированный по первым трём буквам столбец "Name", и уже только потом сортировал по "oLvl"

Текст в m.name содержится такой:
"Раз два три 1"
"Раз два три 2"
"Раз два три 3"
...
"Раз два три 99999"
"Два три четыре 1"
...
"Два три четыре 99999"
"Три четыре пять 1"
...
"Три четыре пять 99999"

Если из кода убрать SUBSTRING, то будет криво сортировать по oLvl, будет учитывать номер в тексте "Name"
Здесь про SUBSTRING ничего не сказано.

Вроде можно этот субстринг запихнуть в перечисление SELECT'а (сделать лишний столбец), и сортировать по нему.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY,
SUBSTRING(m.name FROM  1  FOR  3 ) AS CutName, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY,
SUBSTRING(m.name FROM  1  FOR  3 ) AS CutName, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY  5 ,  11 ;
Можно ли как-нибудь сделать выборку, не меняя количества выходных параметров?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410650
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут тоже про SUBSTRING ничего нет.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410660
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

а) накой там UNION ?
б) почему не UNION ALL ?
в) select * from (твой запрос без order by) order by чего надо
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410688
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

а) сначала выводятся строки с m.occupantUserId = NULL, а через UNION выводятся с m.occupantUserId = числу.
б) дубликатов строк не предвидится.
в) это зачем? Чтобы сортировка была для всего результата, а не для нижнего SELECT'а?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410704
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

RTFM, RTFM и ещё много раз RTFM

а) решается обычным order by без union
б) т.е. на ненужную сортировку (о которой ты и не знаешь) тебе плевать
в) в UNION нет сортировки отдельных селектов, учи язык
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410738
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladdenixx,

RTFM, RTFM и ещё много раз RTFM

а) решается обычным order by без union
б) т.е. на ненужную сортировку (о которой ты и не знаешь) тебе плевать
в) в UNION нет сортировки отдельных селектов, учи язык

а) Мне нужно сортировать по полю с названием (m.name), и потом по полю с левелом (s.level). Если я вставлю в ORDER BY поле m.occupantUserId в начале ORDER BY, то это собъёт мне сортировку по названию (m.name). Если я вставлю это поле в конец ORDER BY, то это мне ничего не даст.
б) А можно поподробнее?
в) Я это понял ещё при использовании MySQL, просто увидел уже достаточно различий, чтобы спросить, не делается ли сортировка по отдельным селектам.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410813
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxа) Мне нужно сортировать по полю с названием (m.name), и потом по полю с левелом (s.level). Если я вставлю в ORDER BY поле m.occupantUserId в начале ORDER BY, то это собъёт мне сортировку по названию (m.name). Если я вставлю это поле в конец ORDER BY, то это мне ничего не даст.
б) А можно поподробнее?
в) Я это понял ещё при использовании MySQL, просто увидел уже достаточно различий, чтобы спросить, не делается ли сортировка по отдельным селектам. а) Нет. Тебе нужно сначала сортировать по m.occupantUserId is [not] null, а уже потом по m.name.

hint: используй CASE m.occupantUserId WHEN NULL THEN 0 ELSE 1 END

б) UNION DISTINCT каким образом удаляет дубликаты, по-твоему ?
в) Стандарт языка не зависит от СУБД. Правда MySQL ему редко следует. Но не до такой же степени.

Итого - учиться, учиться и учиться. А до "Готовлю базу данных для эксплуатации" ещё с годик подождать. Минимум.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410908
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx
Код: plaintext
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.
SELECT 
  m.id AS ID, 
  m.segmentId AS SID, 
m.x AS mX, m.y AS mY, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY SUBSTRING("Name" FROM  1  FOR  3 ),  10 ;


Помоему при таком оформлении запрос читается гораздо лучше:

Код: plaintext
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.
44.
45.
46.
SELECT 
  m.id                     AS ID,
  m.segmentId              AS SID,
  m.x                      AS mX,
  m.y                      AS mY,
  m.name                   AS "NAME",
  ':) -Нет- :)'            AS Occupant,
  ''                       AS oX,
  ''                       AS oY,
  ''                       AS oName,
  ''                       AS oLvl,
  m.resourceTotal          AS RTotal,
  m.timeFound              AS Created,
  m.timeToLiveDays         AS Lives,
  m.collectedResourceLimit AS "LIMIT",
  m.collectionTimeDelayHours
FROM mine AS m
WHERE (m.x >= - 10000 ) AND (m.x <=   10000 )
  AND (m.y >= - 10000 ) AND (m.y <=   10000 )
  AND (m.occupantUserId IS NULL)

UNION

SELECT
  m.id                     AS ID,
  m.segmentId              AS SID,
  m.x                      AS mX,
  m.y                      AS mY,
  m.name                   AS "NAME",
  m.occupantUserId         AS Occupant,
  s.x                      AS oX,
  s.y                      AS oY,
  s.fullName               AS oName,
  s.level                  AS oLvl,
  m.resourceTotal          AS RTotal,
  m.timeFound              AS Created,
  m.timeToLiveDays         AS Lives,
  m.collectedResourceLimit AS "LIMIT",
  m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE (m.x >= - 10000 ) AND (m.x <=   10000 )
  AND (m.y >= - 10000 ) AND (m.y <=   10000 )
  AND (m.occupantUserId = s.id)

ORDER BY
  SUBSTRING("Name" FROM  1  FOR  3 ),  10 
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411241
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему, пофиг.
Зато вот использование BETWEEN вместо этой лажи в условии сразу читаемости добавляет.
Ну и таки UNION ALL.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411366
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryНу и таки UNION ALL. Не нужен там UNION, никакой ;)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411442
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

А, ну да. Я в запрос не вчитывался. Точно, не нужен.
Имитация LEFT JOIN через UNION...
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411834
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladа) Нет. Тебе нужно сначала сортировать по m.occupantUserId is [not] null, а уже потом по m.name.
hint: используй CASE m.occupantUserId WHEN NULL THEN 0 ELSE 1 END
б) UNION DISTINCT каким образом удаляет дубликаты, по-твоему ?

б) Сделал UNION ALL, который, может, уберу, если разберусь с пунктом а).

hvladА до "Готовлю базу данных для эксплуатации" ещё с годик подождать. Минимум.
Готовлю базу данных для учебной эксплуатации в учебном проекте для изучения работы с БД в Java. Так хоть и "масляное масло", но понятнее будет, что я имел ввиду, когда писал эту фразу.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411859
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxГотовлю базу данных для учебной эксплуатации в учебном проекте для изучения работы с БД в JavaЭто совсем другое дело ;)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414640
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то FB медленно работает у меня с прогой.
Обрабатывает 14 записей в секунду. Потом постепенно планка опускается до 3-4 записей в секунду и потом прога зависает.
Пробовал ставить ClassicServer, через него работать - то же самое.

Технология следующая:
Открываем коннекшн.
Создаём CallableStatement.
Вызываем хранимую процедуру, которой передаём необходимые параметры.
ХП проверяет, если запись с таким ID уже есть в базе, обновляет эту запись. Если такого ID в базе нет, то делает инсерт.
ХП в выходную переменную сообщает результат, что она сделала, инсерт или апдейт.
Получаем этот результат и выводим в консоль.
Закрываем коннекшн.

Далее проделывается то же самое со следующей записью.

Мускул же обрабатывает 40-150 записей в секунду. Но там используется InnoDB, и если количество записей в секунду слишком большое, могут выскакивать эксепшены о том, что "буферная память переполнена (слишком много соединений?)".
Соединение используется только одно для всех потоков. Если быть точнее, то потоки синхронизируются по внешнему объекту, чтобы в базу в один момент времени писал только один поток.
Насколько я понимаю в мускуле просто используется буферизация в ОЗУ всего этого дела, а ФБ каждый раз обращается к диску для чтения/записи, потому и медленнее.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414674
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

Кхе-кхе. По "коннекшену" на каждую запись - это сильно!

Hint number one: вставлять/обновлять несколько записей можно и в одном подключении.
Hint number two: даже приведённая схема работы не должна приводить к зависанию - ищите, Шура, ищите глюки в коде.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414742
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx Далее проделывается то же самое со следующей записью.
вы просто издеваетесь над сервером (или над собой).

denixxХП проверяет, если запись с таким ID уже есть в базе, обновляет эту запись. Если такого ID в базе нет, то делает инсерт.
http://www.ibase.ru/devinfo/testiu.htm

denixxи если количество записей в секунду слишком большое,
если записывать напрямую, без всяких одбц, ждбц, ado и прочего ужаса, то скорость вставки даже на десктопном компе может быть 24 тысячи записей в секунду .

denixxОбрабатывает 14 записей в секунду. Потом постепенно планка опускается до 3-4 записей в секунду и потом прога зависает.
стыдоба.
...
Рейтинг: 0 / 0
23 сообщений из 73, страница 3 из 3
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]