![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача имени таблицы в процедуру. [IB6.x]
Ш-К © (2002-05-22 03:55:00)Как организовать что-либо подобное:
CREATE PROCEDURE SELECT_MY_TABLE
(
NAME_OF_TABLE CHAR(50)
NUMBER INTEGER
)
RETURNS
(
BOOL SMALLINT
)
AS
BEGIN
select NUMBER from /* как здесь юзать NAME_OF_TABLE */
where NUMBER = :NUMBER
into :bool;
END
И, если можно, как организовать передачу имени хранимой процедуры в процедуру.
Johnmen (2002-05-23 09:11:00) [1]Ответ автору - нельзя ! (Впрочем уже сказали)
А вообще, удивляет способность некоторых отвечающих отвечать не на поставленный вопрос, да к тому же невнимательно прочитав его
(напр. dimis), и приводить примеры для посторонних СУБД.
Alexandr (2002-05-23 08:54:00) [2]IB это вам не MSSQL.
А такое надо делать на клиенте, или в UDF.
kva (2002-05-23 08:18:00) [3]2Ш-К
Леван подал правильную идею, по крайней мере реализуемую, только вместо двойных кавычек надо одинарные. У меня так работает, правда под MSSQL
Ш-К (2002-05-23 00:30:00) [4]2 dimis (22.05.02 16:30)
Я просто упростил демо пример. Его-то и можно так решить. На самом деле всё сложнее.
Созданием вьиверов или специальных таблиц проблему не решить. Там ещё кроме выборки и модификации требуются.
2 ALL
ТАК НЕУЖЕЛИ НЕЛЬЗЯ НА СТОРОНЕ СЕРВЕРА СДЕЛАТЬ ТАКОЕ?!!
dimis (2002-05-22 16:30:00) [5]хм... вот мы тупим
а почему бы не сделать вьюшку, тем более что все таблицы имеют одинаковую структуру
create view MyView(id number,text char(100),TableName char(100)
as
select numb,text,"Table1" from Table1
union
select numb,text,"Table2" from Table2
union
select numb,text,"Table3" from Table3
union
select numb,text,"Table4" from Table4
и все
все данные находятся в одном месте
CREATE PROCEDURE SELECT_MY_TABLE
(
NAME_OF_TABLE CHAR(50)
NUMBER INTEGER
)
RETURNS
(
BOOL SMALLINT
)
AS
BEGIN
select NUMBER from MyView
where NUMBER = :NUMBER and TableName=:NAME_OF_TABLE
into :bool;
END
и все
Подходит такой вариант?
Ш-К (2002-05-22 12:16:00) [6]2 Леван (22.05.02 09:50)
Не работает.
execне работает.
Alexandr (2002-05-22 12:02:00) [7]ага, тогда правильно.
Ш-К (2002-05-22 11:58:00) [8]А как это в реальном или не в реальном?
Данные сначала собираются на абонентах (если сервер не работает, до суток расчитано); потом, со всех абонентов складываются в комутаторе (это штука для подключения к ЛВС); потом кешируются на машине, к которой всё железо и подключается; а потом, последовательно шлётся в БД.
На практике все банки и кеши всегда чистые - система получается в реале.
Alexandr (2002-05-22 11:42:00) [9]а данные в реальном времени в базу пишутся что-ли?
Тогда в этом первая грубая ошибка проектирования.
Ш-К (2002-05-22 11:36:00) [10]
> при многопользовательской работе, да и не только
> глюков будет немеряно. Так не делают!
Могу отключать всех - не страшно.
> да и что за процедура?
Подробнее:
Есть таблица (журнал). В него поступают все данные; 1-3 р/сек. Триггер журнала, помимо того, что он делает, ещё и вызывает эту самую процедуру. Процедура выполняет действия над разными таблицами. Разные таблицы - разные действия. Очень неповоротливая. И хочу, чтобы она получала некоторые внешние переменные: имя таблицы или дескриптор (где-то выше писал о нём).
Думаю, так проще, чем перерисовывать её каждый раз на клиенте. Тем более, что она не одна такая.
kaif (2002-05-22 11:02:00) [11]>Alexandr © (22.05.02 10:52)
>да и что за процедура? Мож для каждой новой таблицы новую >процедуру создавать7
а почему бы и нет?
ведь создаются самим сервером для каждой новой таблицы триггеры для check constraints и подобные вещи, и ничего...
kaif (2002-05-22 10:58:00) [12]>Alexandr © (22.05.02 10:51)
>при многопользовательской работе, да и не только
>глюков будет немеряно. Так не делают!
Согласен. Более того, для замена текста процедуры нужно войти с правоми ее владельца, например SYSDBA.
Но как мне кажется, здесь речь идет не о том, что сотни юзеров навалятся таблицы создавать, а просто нужно иметь такую возможность иногда, при добавлении нового прибора в систему. Это может сделать и SYSDBA. А если будет удобное окно с кнопкой, где он сможет это сделать, то SYSDBA будет просто счастлив.
Alexandr (2002-05-22 10:52:00) [13]да и что за процедура? Мож для каждой новой таблицы новую процедуру создавать7
Alexandr (2002-05-22 10:51:00) [14]при многопользовательской работе, да и не только
глюков будет немеряно. Так не делают!
kaif (2002-05-22 10:29:00) [15]> 2 Alexandr © (22.05.02 07:04)
На стороне сервера действительно нельзя автоматизировать изменение текста процедуры, а вот со стороны клиента - можно.
Клиент может послать подряд:
CREATE TABLE...
COMMIT;
ALTER PROCEDURE...
COMMIT;
Организовать это можно при помощи IBQuery и IBTransaction.
Леван (2002-05-22 09:50:00) [16]Если в процедуре писать
exec("select ****** from "+Name_of_table+ " where.......")
то это должно сработать так, как нужно!
Леван
Ш-К (2002-05-22 09:21:00) [17]2 dimis (22.05.02 08:47)
Кроме IB ничего юзать нельзя :(
Хорошая тема для герации на клиенте. Или на отдельном специальном клиенте - типа брокере.
А вот по варианту что-то сразу не въезжаю.
Это под Оракл?
dimis (2002-05-22 08:47:00) [18]В Oracle есть понятие "динамический запрос" когда текст запроса можно созвавать в хранимой процедуре на лету и потом его выполнять.
В IB не знаю такого
Мой вариант
после того как пользователь выбрал структуру таблиц
сделай Create procedure, которая сделает выборку из этих таблиц
if... if ... if
если база многопользоватеская(что скорее всего,так как используется IB)предлагаю сделать имя процеруры такой
ProcTableName1_TableName2_TableName3....
так что cкорее всего не придется создавать для каждого пользователя свои процедуры. Просто когда надо запросить данные приложение само генерирует имя процедуры и вызывает её.
Это проходит если тебе известны имена таблиц.
Конечно при этом варианте может появиться мусор в виде неиспользуемых процедур.
А всетаки самй простой вариант генерировать запрос на стороне клиента загонять его в Query (или что-то еще) и просто исполнять запрос
Ш-К (2002-05-22 08:04:00) [19]В том то и дело, что разная. Может одно поле быть, а может 20. Не считая служебных, которые одинаковые. Это показания приборов. И подразумевается, что пользователь сам определит структуру таблиц. А приборов десятки типов. Для каждого типа - таблица.
Alexandr (2002-05-22 07:55:00) [20]а чего бы эти данные, которые у тебя сейчас в разных таблицах, в одной не держать с признаком соответствующим. У них что, структура совсем разная?