![]() |
|
Модераторы: Akella |
![]()
|
|
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Написал процедуру (FireBierd 2.1 доступ из Delphi 2009 через InterBase).
Мне нужно, чтобы она работала получая имя таблицы как входящий параметр. Вот код, когда я задаю имя таблицы как входящий параметр, процедура не компилится (пробовал и с двоеточием):
А когда задаю имя таблицы явно, все прекрасно компилируется и работает:
Подскажите как в процедуру передать имя таблицы как входящий параметр? Это сообщение отредактировал(а) Alkor135 - 27.5.2009, 00:45 |
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
Пока не могу сообразить. Но, наверное, придётся использовать execute statement
Добавлено через 3 минуты и 59 секунд Примеры>> Добавлено через 5 минут и 43 секунды Кстати, источник:
|
|||
|
||||
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Спасибо, буду разбираться. |
||||
|
|||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
Alkor135, опиши задачу, может обойдемся без execute statement
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
У меня есть 27 таблиц. Делаю выборку и получаю 27 строк, сортирую их по 7 полю и оставляю только 14 строк, т.е. остаются строки только из тех таблиц из которых нужно делать сдедующие выборки. Т.к. выборка у меня в StringGrid, беру и присваиваю значения ячеек с именами таблиц, созданным переменным. Вот теперь эти переменные мне и нужно передать как входные параметры в процедуру, где эти входные параметры будут стоять на месте имени таблицы. По большому счету, нужно из выборки из 27 таблиц определить с какими 14 в дальнейшем работать (это уже реализовано). Теперь нужно сформировать запрос к этим 14 таблицам. Процедуру написать легко если изначально знать имена всех 14 таблиц, но набор будет меняться в зависимости от даты выборки 27 таблиц. Не знаю, понятно ли объяснил. Есть мыслишка как это в Delphi сделать, т.е. значеня переменных вставлять в Query запрос. |
|||
|
||||
| Deniz |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
я не понял
Посмотрев на код типа
Если задать дату, больше которой нет в таблице, будет как в анекдоте: "Ну у Вас и запросы - сказала база данных и повисла." Это реализовывается 1 запросом:
Опять же зачем хранить отдельно date и time, есть же timestamp? Это сообщение отредактировал(а) Deniz - 28.5.2009, 09:00 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
| Alkor135 |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
То, что я только начал изучать SQL - это правда. А вот то, что я не пробовал min и max - это не правда. У меня сделано 27 вот таких поцедуд (к каждой таблице):
И она, которая получает результат из всех 27:
Так вок: сейчас у меня все прекрасно работает и сводную таблицу я получаю за 3 секунды. Когда пользовался min и max, сводная таблица получалась за 40 секунд. Поэтому я отказался от использования min и max. |
||||||||||
|
|||||||||||
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Ну вот, вспомнил Deniz анекдот, у меня прога и повисла.
Вот такую хранимую процедуру в БД:
при этом все прекрасно работает ![]() Я загружаю в StringGrid вот такой процедурой из Delphi:
И прога виснет. Может кто может подсказать, где я ошибся? Это сообщение отредактировал(а) Alkor135 - 28.5.2009, 11:25 |
||||
|
|||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Сколько по времени выполняется процедура в IBExpert'е? И скольк по времени программа находиться в "подвешеном" состоянии? Как вариант диагноз может быть такой: Поскольку обращение к БД не вынесено в отдельный поток и выполняется за ощутимое (т.е. 1, 2 и более секунд) время, то пользовательский интерфейс клиентской (той которая обращается к БД) программы "подвисает" и приложение "Не отвечает". Но при этом не факт, что оно не работает. Сам с таким столкнулся и пришлось запрос к БД выносить в отдельный процес - жуть... -------------------- Слава Україні! |
|||
|
||||
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
В IBExpert процедура обрабатывается за 1-2 секунды. Когда вызываю из Delphi, то 5 минут ждал, потом надоело и закрыл. Отсюда и вынес вердикт, что она повесилась. А как вынести в отдельный поток обращение к базе? Ой, нашел свою ошибочку. Орфография хромает. Это сообщение отредактировал(а) Alkor135 - 28.5.2009, 11:26 |
||||
|
|||||
| Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
При одинаковых входящих параметрах (извиняюсь за недоверчивость А вообще к БД обращение проходить нормально, т.е. любой другой запрос выполняется или это пока первый?
Я пишу на CLI\C++ (не советую связываться, если под .NET, то лучше С# сразу брать и не мучаться -------------------- Слава Україні! |
||||
|
|||||
| Alkor135 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Вот-вот, во входящие параметры закралась ошибочка, но теперь то я пост подправил и ее не видно. А вообще это мой первый проект по программированию как в Delphi так и в SQL (FireBird). Delphi мне показался проще чем С++. До сих пор вехать не могу, чтож за классы там такие. К томуже, примеров для Delphi нашел больше. Мне вообще советовали на Java писать, говорят кросплатформенная штука, за ней будующее. |
||||||
|
|||||||
| Deniz |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
не верю (с) Сравни 2 кода на быстродействие (сделай 2 тестовые процедуры):
причем, в первом случае чем дальше нужная дата тем дольше будет работать. А во втором время практически не изменится. Наличие индекса по дате может улучшить оба варианта. PS: К тому же первый вариант некорректен, есть возможность бесконечного(пока размер даты не кончится) цикла. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
А FireBird, где-нибудь показывает за какое время он выполнил процедуру? Я сравнил визуально, моя выполняется за 2 сек., твоя за 3 сек., но я могу быть субективен. Зато очень сильно отличаюся по скорости две моих других процедуры. Та что за 2 сек.
Вторая с min и max выполняется почти 2 мин.:
Хотя эти процедуры не совсем равнозначны. У первой два входных параметра, а вторая один входной обсчитывает и делает два параметра внутри себя. Может действительно скорость выполнения не от использования min и max зависит? Тогда подскажите отчего она такая разная? Кстати все таблицы у меня проиндексированы по двум полям (по дате и по времени). Это сообщение отредактировал(а) Alkor135 - 28.5.2009, 17:06 |
||||
|
|||||
| Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Ну здрасте, а скриншот ты с чего делал?! Не с IBExpert'а?! Вот в нём при выполнении запроса в нижней части активного окна появляется Memo-поле, куда выводиться код ошибки, план запроса и время выполнения запроса! -------------------- Слава Україні! |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
||||
|
||||
| Deniz |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
честно говоря подробно не разбирался, но такое ощущение, что они еще и результат разный выдают. Та, что с min ищет минимальную дату на прошлой неделе, а другая "смотрит" вперед по датам. Даже твой "страшный" select с extract'ом можно оптимизировать до неузнаваемости. Например, сначала вычислить период прошлой недели (дата начала и дата окончания недели), от переданной даты. А потом
Подсказка, если удается добиться использования уникального индекса, скорость возрастает на порядки, неуникальный хороший индекс тоже поможет. А вообще читай www.ibase.ru и вот например FAQ: оптимизация запросов -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||
|
|||||||
| Alkor135 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Извиняйте, ребята. Я еще совсем мало с IBExpert работаю. Вот смотрю на экран и не вижу этого memo поля. Ткните меня носом, где оно должно быть? А может я что-то в настройках не включил? ![]() |
||||
|
|||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
||||
|
||||
| Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Да ради Бога
Да... Я тоже удивился, что его нету... Что бы появилось нужно нажать на кнопочку "Edit" (после выполнения процедуры) и искать это поле внизу. А ещё можно выполнять процедуры несколько иначе. Создать новый скрипт (кнопочка обведена желтым) вставить в него код вызова процедуры и выполнить. И ещё... У Вас нет тригеров и генераторов - это хоть и возможно, но весьма подозритьельно, а вот то что нет доменов - это однозначно, не то что бы не правильно, а скорее не оптимально с точки зрения удобства работы с кодом. ![]() Это сообщение отредактировал(а) Gluttton - 29.5.2009, 07:50 -------------------- Слава Україні! |
||||
|
|||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Deniz, спасибо за мысли и за ссылки.
Поразбираюсь на досуге. |
|||
|
||||
| Deniz |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Gluttton, триггеров действительно нет, но думаю они и не нужны мне.
Ведь событий у таблиц не будет, мне не нужны в них изменения. Насчет генераторов... не вижу в них практической пользы. Насчет Доменов, вообще не понял, что это за зверь и с чем его едят? Попробовал после выполнения процедуры переключиться на вкладку Edit, но поля со временем выполнения процедуры опять не нашел: ![]() Через SQL редактор, тестировать на скорость каждый запрос в процедуре, мне кажется долго, но если необходимость возникнет, то сделаю. Спасибо за подсказку. |
|||
|
||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Deniz, да, теперь я понял, что только в запрсах можно посмотреть время выполнения.
А вот было бы в процедурах, было бы замечательно. Вот как организовать запрос у: while (NOT exists (SELECT da FROM audcad WHERE da = :p_input_date_min)) do p_input_date_min = p_input_date_min + 1; |
|||
|
||||
| Gluttton |
|
||||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Это конечно не относиться к теме, но раз сказал "А", то говорю и "В". Отсутствие тригеров и генераторов - признак того, что в БД отсутствуют поля AUTOINCREMENT в нотации Access, которые приверженцы сурогатных ключей используют в качестве первичных ключей. Но это совершенно не догма. Домены, не знаю как это будет правильно, но если своими словами, то это именованый пользовательский тип данных, например: определив однажды домен:
можно его многократно использовать в дальнейшем (при создании таблиц):
Ну дык
Это сообщение отредактировал(а) Gluttton - 29.5.2009, 09:01 -------------------- Слава Україні! |
||||||||
|
|||||||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
||||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
Так же можно просто сделать select из процедуры
Согласен с Gluttton, отсутствие доменов, генераторов и триггеров настораживает. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Gluttton, я так понял, что триггеры и генераторы мне не нужны.
Зачем мне суррогатные ключи, скорости они не прибавят. Спасибо за просвящение с Доменами, теперь их использовать мне тоже не имеет смысла, ведь таблицы уже созданы. Добавлено @ 12:52 Akella, спасибо за подсказки по настройке интерфейса. Оказывается IBExpert и по русски может Akella, Gluttton, Deniz, попробовал я выполнить процедуру из SQL редактора. Все равно время выполнения не показывает. ![]() А может это ограничения персональной версии. Ведь не открывается у меня анализ плана, говорит, что в персональной версии не предусмотрено. Это сообщение отредактировал(а) Alkor135 - 29.5.2009, 12:54 |
|||
|
||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Я свой вопрос решил.
Правда не имя таблицы загонял как входящий параметр, а вклеивал начало вызываемой процедуры(через Query) из Delphi.
Всем Большое Спасибо!!! По Вашим советам позже еще пооптимизирую SQL код. Всем бы поставил плюсики, но говорят у меня еще постов для этого мало :( . Это сообщение отредактировал(а) Alkor135 - 29.5.2009, 14:19 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
Первый раз слышу про персональную версию. Скачай полную http://forum.vingrad.ru/index.php?showtopi...t&p=1866918 |
|||
|
||||
| Alkor135 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Да вроде у меня официальная версия. ![]() А вот эти функции не работают: ![]() Говорит: ![]() А если другую версию качать по ссылке, то файл называется setup_trial.exe ? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
||||
|
||||
| Alkor135 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Ой спасибо, Akella! Теперь у меня время выполнения показывает. Сравнил я скорости выполнения запросов с min и без него. Я оказался прав. Без использования min запрос обрабатывается быстрее. Без min: ![]() C использованием min: ![]() Вот код процедуры без использования min:
Вот код процедуры с использованием min:
Может конечно, я что-то сделал необъективно. Предлагаайте проведу еще тест, чтобы выяснить действительно ли использование min и max увеличивает время исполнения запроса. |
||||||||
|
|||||||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 22 Всего: 44 |
Alkor135попробуй во 2 процедуре все перевести на min/max
И покажи какие индексы есть на таблицу audcad. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]()
|
| Правила форума "Interbase" | |
|
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |