![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имя таблицы как параметр запроса
StriderMan © (2006-08-02 20:19:00)Нужно написать хранимую процедуру, которая будет работать сразу для нескольких таблиц.
Можно ли как-то передать в запрос имя таблицы?
StriderMan (2006-08-03 15:50:00) [61]
> задача?
у двух записи в таблице взаимно поменять значение уникального поля.
Dok (2006-08-03 14:12:00) [62]
> вобщем-то так сейчас и работает. Но для совершения операции
> нужно сделать 4! запроса. Поэтому и пришла мысль переделать
> на ХП. а в ХП просто так не передашь имя таблицы. Буду пробовать
> Execute statement
а зачем это все городить? задача?
StriderMan (2006-08-03 14:03:00) [63]
> Dok (03.08.06 13:56) [15]
> А вчем проблема заюзать конкатенацию строк?
вобщем-то так сейчас и работает. Но для совершения операции нужно сделать 4! запроса. Поэтому и пришла мысль переделать на ХП. а в ХП просто так не передашь имя таблицы. Буду пробовать Execute statement
Dok (2006-08-03 13:56:00) [64]
> Можно ли как-то передать в запрос имя таблицы?
А вчем проблема заюзать конкатенацию строк?
Query1.SQL.Text := 'select * from ' + TableName;
Query1.Open();
Или Format?
StriderMan (2006-08-03 13:19:00) [65]
> Sergey13 © (03.08.06 13:12) [13]
> 1.ХП в таблицу не добавляют. ХП - это отдельный объект БД.
сорри, неверно сказал. Имел ввиду ХП для каждой таблицы
Sergey13 (2006-08-03 13:12:00) [66]> [11] StriderMan © (03.08.06 12:22)
1.ХП в таблицу не добавляют. ХП - это отдельный объект БД.
2.Дело твое.
StriderMan (2006-08-03 12:24:00) [67]
> PEAKTOP © (03.08.06 09:22) [9]
спасибо, попробую
> Johnmen © (03.08.06 09:32) [10]
посмотрю
StriderMan (2006-08-03 12:22:00) [68]
> Sergey13 © (03.08.06 09:15) [8]
> ИМХО, лучше в процедуре сделать несколько веток в зависимости
> от параметра. Избавляет от постоянного разбора/перекомпиляции
> запроса сервером
Тогда проще в каждую таблицу ХП добавить.
Johnmen (2006-08-03 09:32:00) [69]
> PEAKTOP © (03.08.06 09:22) [9]
В документации примеры лучше и их больше. С комментариями.
PEAKTOP (2006-08-03 09:22:00) [70]
CREATE PROCEDUREMY_REFERENCE(
Q_TABLE_NAME VARCHAR(31)
) RETURNS(
ID INTEGER,
NAME VARCHAR(100)
)
AS
DECLARE VARIABLEP_SQL_STMT VARCHAR(255);
BEGIN
IF(:Q_TABLE_NAME IS NULL) THEN
BEGIN
SUSPEND;
EXIT;
END
P_SQL_STMT = 'SELECT CAST(TB.ID AS INTEGER), TB.NAME FROM '||:Q_TABLE_NAME||' TB ';
FOR
EXECUTE STATEMENT:P_SQL_STMT INTO:ID, :NAME
DO
SUSPEND;
END
)
Sergey13 (2006-08-03 09:15:00) [71]ИМХО, лучше в процедуре сделать несколько веток в зависимости от параметра. Избавляет от постоянного разбора/перекомпиляции запроса сервером.
StriderMan (2006-08-03 09:13:00) [72]Всем спасибо, буду пробовать
Johnmen (2006-08-03 09:09:00) [73]Уже сказали, execute statement. Добавлю - читать документацию...
StriderMan (2006-08-03 08:51:00) [74]сервер FireBird 1.5
DrPass (2006-08-03 01:39:00) [75]
> сделать SELECT * FROM :tbl нельзя
Непосредственно так нельзя. Но если сервером поддерживается execute statement в той или иной ипостаси, текст запроса можно сформировать динамически в самой процедуре, в том числе и из передаваемых параметров. Само собой, такие запросы не прекомпилируются, соответственно, еще нужно убедиться, что их использование подходит с точки зрения производительности
Anatoly Podgoretsky (2006-08-02 22:40:00) [76]Динамические запросы можно делать где угодно.
А вот сделать SELECT * FROM :tbl нельзя
Megabyte (2006-08-02 21:29:00) [77]В MSSQL Server, например, есть такая возможность - это динамически формируемый(соответственно, с параметрами) на сервере запрос.
Все зависит от сервака!
Anatoly Podgoretsky (2006-08-02 20:28:00) [78]Метаданные не могут использоваться в параметрах.
Хранимые процедуры не относятся к Дельфи и они зависят от сервера.
Так что тебе на форум по серверу.