Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Вниз

Передача имени таблицы в процедуру.   Найти похожие ветки 

 
Ш-К   (2002-05-22 03:55) [0]

Как организовать что-либо подобное:

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


И, если можно, как организовать передачу имени хранимой процедуры в процедуру.


 
Alexandr   (2002-05-22 06:17) [1]

никак, только через IF и несколько select для каждой таблицы.


 
Ш-К   (2002-05-22 07:01) [2]

А можно тогда как-нибудь автоматизировать процесс модификации такой процедуры при создании юзером новых таблиц или удалением старых? (для случая IF...IF...IF...)


 
Alexandr   (2002-05-22 07:04) [3]

Если коротко ответить, то "нельзя".

А с чего это у тебя юзер таблицы сам создает.

Чего -то не то у тебя в программе :)


 
Ш-К   (2002-05-22 07:42) [4]

Знаю, что чего-то не то.
Просто пытаюсь смоделировать.
Пользователь сам задаёт структуру некоторых данных (таблиц я полагаю) через мой интерфейс. Не в блобы же эту структуру загонять. По ней и выборка нужна. Примитивная. Так вот как это представить?

Но это пол дела. Для всех записей таких таблиц общий генератор ключевого поля (дескриптор назову). Т. е. запись однозначно идентифицируется не только в своей таблице, а в, скажем, группе таблиц.

И изходя из этого нужна процедура, которая по одному дескриптору может изменить одно поле в любой записи (имя и тип поля везде одинаковый).

Может я чего перемудрил и оно не так строится?


 
Alexandr   (2002-05-22 07:55) [5]

а чего бы эти данные, которые у тебя сейчас в разных таблицах, в одной не держать с признаком соответствующим. У них что, структура совсем разная?


 
Ш-К   (2002-05-22 08:04) [6]

В том то и дело, что разная. Может одно поле быть, а может 20. Не считая служебных, которые одинаковые. Это показания приборов. И подразумевается, что пользователь сам определит структуру таблиц. А приборов десятки типов. Для каждого типа - таблица.


 
dimis   (2002-05-22 08:47) [7]

В Oracle есть понятие "динамический запрос" когда текст запроса можно созвавать в хранимой процедуре на лету и потом его выполнять.
В IB не знаю такого
Мой вариант
после того как пользователь выбрал структуру таблиц
сделай Create procedure, которая сделает выборку из этих таблиц
if... if ... if
если база многопользоватеская(что скорее всего,так как используется IB)предлагаю сделать имя процеруры такой
ProcTableName1_TableName2_TableName3....
так что cкорее всего не придется создавать для каждого пользователя свои процедуры. Просто когда надо запросить данные приложение само генерирует имя процедуры и вызывает её.
Это проходит если тебе известны имена таблиц.

Конечно при этом варианте может появиться мусор в виде неиспользуемых процедур.

А всетаки самй простой вариант генерировать запрос на стороне клиента загонять его в Query (или что-то еще) и просто исполнять запрос


 
Ш-К   (2002-05-22 09:21) [8]

2 dimis (22.05.02 08:47)

Кроме IB ничего юзать нельзя :(

Хорошая тема для герации на клиенте. Или на отдельном специальном клиенте - типа брокере.

А вот по варианту что-то сразу не въезжаю.
Это под Оракл?


 
Леван   (2002-05-22 09:50) [9]

Если в процедуре писать
exec("select ****** from "+Name_of_table+ " where.......")
то это должно сработать так, как нужно!
Леван


 
kaif   (2002-05-22 10:29) [10]

> 2 Alexandr © (22.05.02 07:04)
На стороне сервера действительно нельзя автоматизировать изменение текста процедуры, а вот со стороны клиента - можно.
Клиент может послать подряд:
CREATE TABLE...
COMMIT;
ALTER PROCEDURE...
COMMIT;
Организовать это можно при помощи IBQuery и IBTransaction.


 
Alexandr   (2002-05-22 10:51) [11]

при многопользовательской работе, да и не только
глюков будет немеряно. Так не делают!


 
Alexandr   (2002-05-22 10:52) [12]

да и что за процедура? Мож для каждой новой таблицы новую процедуру создавать7


 
kaif   (2002-05-22 10:58) [13]

>Alexandr © (22.05.02 10:51)
>при многопользовательской работе, да и не только
>глюков будет немеряно. Так не делают!

Согласен. Более того, для замена текста процедуры нужно войти с правоми ее владельца, например SYSDBA.
Но как мне кажется, здесь речь идет не о том, что сотни юзеров навалятся таблицы создавать, а просто нужно иметь такую возможность иногда, при добавлении нового прибора в систему. Это может сделать и SYSDBA. А если будет удобное окно с кнопкой, где он сможет это сделать, то SYSDBA будет просто счастлив.


 
kaif   (2002-05-22 11:02) [14]

>Alexandr © (22.05.02 10:52)
>да и что за процедура? Мож для каждой новой таблицы новую >процедуру создавать7

а почему бы и нет?
ведь создаются самим сервером для каждой новой таблицы триггеры для check constraints и подобные вещи, и ничего...


 
Ш-К   (2002-05-22 11:36) [15]


> при многопользовательской работе, да и не только
> глюков будет немеряно. Так не делают!


Могу отключать всех - не страшно.


> да и что за процедура?


Подробнее:
Есть таблица (журнал). В него поступают все данные; 1-3 р/сек. Триггер журнала, помимо того, что он делает, ещё и вызывает эту самую процедуру. Процедура выполняет действия над разными таблицами. Разные таблицы - разные действия. Очень неповоротливая. И хочу, чтобы она получала некоторые внешние переменные: имя таблицы или дескриптор (где-то выше писал о нём).
Думаю, так проще, чем перерисовывать её каждый раз на клиенте. Тем более, что она не одна такая.



 
Alexandr   (2002-05-22 11:42) [16]

а данные в реальном времени в базу пишутся что-ли?
Тогда в этом первая грубая ошибка проектирования.


 
Ш-К   (2002-05-22 11:58) [17]

А как это в реальном или не в реальном?
Данные сначала собираются на абонентах (если сервер не работает, до суток расчитано); потом, со всех абонентов складываются в комутаторе (это штука для подключения к ЛВС); потом кешируются на машине, к которой всё железо и подключается; а потом, последовательно шлётся в БД.

На практике все банки и кеши всегда чистые - система получается в реале.


 
Alexandr   (2002-05-22 12:02) [18]

ага, тогда правильно.


 
Ш-К   (2002-05-22 12:16) [19]

2 Леван (22.05.02 09:50)

Не работает.
exec не работает.


 
dimis   (2002-05-22 16:30) [20]

хм... вот мы тупим
а почему бы не сделать вьюшку, тем более что все таблицы имеют одинаковую структуру
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-23 00:30) [21]

2 dimis (22.05.02 16:30)

Я просто упростил демо пример. Его-то и можно так решить. На самом деле всё сложнее.
Созданием вьиверов или специальных таблиц проблему не решить. Там ещё кроме выборки и модификации требуются.

2 ALL

ТАК НЕУЖЕЛИ НЕЛЬЗЯ НА СТОРОНЕ СЕРВЕРА СДЕЛАТЬ ТАКОЕ?!!


 
kva   (2002-05-23 08:18) [22]

2Ш-К
Леван подал правильную идею, по крайней мере реализуемую, только вместо двойных кавычек надо одинарные. У меня так работает, правда под MSSQL


 
Alexandr   (2002-05-23 08:54) [23]

IB это вам не MSSQL.

А такое надо делать на клиенте, или в UDF.


 
Johnmen   (2002-05-23 09:11) [24]

Ответ автору - нельзя ! (Впрочем уже сказали)
А вообще, удивляет способность некоторых отвечающих отвечать не на поставленный вопрос, да к тому же невнимательно прочитав его
(напр. dimis), и приводить примеры для посторонних СУБД.




Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
3-55007
Proton
2002-05-19 19:34
2002.06.17
Чем порекомендуетк пользоваться при созании отчетов?


3-54968
Chainik
2002-05-22 14:10
2002.06.17
Создание динамических запросов


1-55064
SleD
2002-06-02 14:13
2002.06.17
Насчёт КРУГЛЫХ картинок


14-55284
Neon_space
2002-05-14 20:28
2002.06.17
Конвертирование проектов Delphi в проекты C++ Builder


1-55164
PTE
2002-06-04 12:47
2002.06.17
Как отчистить содержимое StringGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский