Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

Имя таблицы как параметр запроса   Найти похожие ветки 

 
StriderMan ©   (2006-08-02 20:19) [0]

Нужно написать хранимую процедуру, которая будет работать сразу для нескольких таблиц.

Можно ли как-то передать в запрос имя таблицы?


 
Anatoly Podgoretsky ©   (2006-08-02 20:28) [1]

Метаданные не могут использоваться в параметрах.
Хранимые процедуры не относятся к Дельфи и они зависят от сервера.
Так что тебе на форум по серверу.


 
Megabyte ©   (2006-08-02 21:29) [2]

В MSSQL Server, например, есть такая возможность - это динамически формируемый(соответственно, с параметрами) на сервере запрос.

Все зависит от сервака!


 
Anatoly Podgoretsky ©   (2006-08-02 22:40) [3]

Динамические запросы можно делать где угодно.
А вот сделать SELECT * FROM :tbl нельзя


 
DrPass ©   (2006-08-03 01:39) [4]


> сделать SELECT * FROM :tbl нельзя

Непосредственно так нельзя. Но если сервером поддерживается execute statement в той или иной ипостаси, текст запроса можно сформировать динамически в самой процедуре, в том числе и из передаваемых параметров. Само собой, такие запросы не прекомпилируются, соответственно, еще нужно убедиться, что их использование подходит с точки зрения производительности


 
StriderMan ©   (2006-08-03 08:51) [5]

сервер FireBird 1.5


 
Johnmen ©   (2006-08-03 09:09) [6]

Уже сказали, execute statement. Добавлю - читать документацию...


 
StriderMan ©   (2006-08-03 09:13) [7]

Всем спасибо, буду пробовать


 
Sergey13 ©   (2006-08-03 09:15) [8]

ИМХО, лучше в процедуре сделать несколько веток в зависимости от параметра. Избавляет от постоянного разбора/перекомпиляции запроса сервером.


 
PEAKTOP ©   (2006-08-03 09:22) [9]


CREATE PROCEDURE MY_REFERENCE(
 Q_TABLE_NAME VARCHAR(31)
)RETURNS(
 ID INTEGER,
 NAME VARCHAR(100)
)
AS
 DECLARE VARIABLE P_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
)


 
Johnmen ©   (2006-08-03 09:32) [10]


> PEAKTOP ©   (03.08.06 09:22) [9]


В документации примеры лучше и их больше. С комментариями.


 
StriderMan ©   (2006-08-03 12:22) [11]


> Sergey13 ©   (03.08.06 09:15) [8]
> ИМХО, лучше в процедуре сделать несколько веток в зависимости
> от параметра. Избавляет от постоянного разбора/перекомпиляции
> запроса сервером

Тогда проще в каждую таблицу ХП добавить.


 
StriderMan ©   (2006-08-03 12:24) [12]


> PEAKTOP ©   (03.08.06 09:22) [9]

спасибо, попробую

> Johnmen ©   (03.08.06 09:32) [10]

посмотрю


 
Sergey13 ©   (2006-08-03 13:12) [13]

> [11] StriderMan ©   (03.08.06 12:22)

1.ХП в таблицу не добавляют.  ХП - это отдельный объект БД.
2.Дело твое.


 
StriderMan ©   (2006-08-03 13:19) [14]


> Sergey13 ©   (03.08.06 13:12) [13]
> 1.ХП в таблицу не добавляют.  ХП - это отдельный объект БД.

сорри, неверно сказал. Имел ввиду ХП для каждой таблицы


 
Dok   (2006-08-03 13:56) [15]


> Можно ли как-то передать в запрос имя таблицы?

А вчем проблема заюзать конкатенацию строк?

Query1.SQL.Text := "select * from " + TableName;
Query1.Open();

Или Format?


 
StriderMan ©   (2006-08-03 14:03) [16]


> Dok   (03.08.06 13:56) [15]
> А вчем проблема заюзать конкатенацию строк?


вобщем-то так сейчас и работает. Но для совершения операции нужно сделать 4! запроса. Поэтому и пришла мысль переделать на ХП. а в ХП просто так не передашь имя таблицы. Буду пробовать Execute statement


 
Dok   (2006-08-03 14:12) [17]


> вобщем-то так сейчас и работает. Но для совершения операции
> нужно сделать 4! запроса. Поэтому и пришла мысль переделать
> на ХП. а в ХП просто так не передашь имя таблицы. Буду пробовать
> Execute statement

а зачем это все городить? задача?


 
StriderMan ©   (2006-08-03 15:50) [18]


> задача?

у двух записи в таблице взаимно поменять значение уникального поля.


 
Dok   (2006-08-03 15:52) [19]


> у двух записи в таблице взаимно поменять значение уникального
> поля.

и? зачем тут ХП?


 
StriderMan ©   (2006-08-03 15:55) [20]


> и? зачем тут ХП?

чтобы не кидать с клиента несколько запросов. а именно 4 штуки.


 
Sergey13 ©   (2006-08-03 15:55) [21]

> [18] StriderMan ©   (03.08.06 15:50)

Очень странная задача. Если она постоянная (а иначе зачем ХП), то я бы задумался об основах.


 
Dok   (2006-08-03 15:59) [22]


> чтобы не кидать с клиента несколько запросов. а именно 4
> штуки

т.е. 4 запроса поменять значения у 2-х записей? 2 запроса. где четыре? И если это часто, то что-то в консерватории не так.


 
StriderMan ©   (2006-08-03 15:59) [23]


> Очень странная задача

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


 
StriderMan ©   (2006-08-03 16:04) [24]


> Dok   (03.08.06 15:59) [22]

поле-то уникальное! поэтому приходится через промежуточное значение. итого 3. а 4 - SELECT чтобы определить что мы "наткнулись" на такую запись.


 
Dok   (2006-08-03 16:17) [25]


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

если это ПК, то играешся с огнем.

> поле-то уникальное! поэтому приходится через промежуточное
> значение. итого 3. а 4 - SELECT чтобы определить что мы
> "наткнулись" на такую запись.

Согласен 3 запроса. 4-й зачем?


 
StriderMan ©   (2006-08-03 16:23) [26]


> если это ПК, то играешся с огнем.

что такое ПК? ключевое поле? нет не ключевое.


> 4-й зачем?

я ж написал зачем:

> а 4 - SELECT чтобы определить что мы "наткнулись" на такую запись.

от этого зависит логика.
1. узнаем, есть ли запись со значением поля, которое нам надо выставить в текущей записи.
2. Если нет - то просто меняем в текущей. Если есть - то меняем у найденной записи поле в некое свободное значение
3. меняем у текущей записи поле в нужное значение
4. меняем у записи, которую поменяли в пункте 2 значение поля в то, которое было у текущей до начала всей операции.


 
Dok   (2006-08-03 16:34) [27]


> что такое ПК? ключевое поле? нет не ключевое.

Первичны Ключ


> от этого зависит логика.
> 1. узнаем, есть ли запись со значением поля, которое нам
> надо выставить в текущей записи.
> 2. Если нет - то просто меняем в текущей. Если есть - то
> меняем у найденной записи поле в некое свободное значение
> 3. меняем у текущей записи поле в нужное значение
> 4. меняем у записи, которую поменяли в пункте 2 значение
> поля в то, которое было у текущей до начала всей операции.
>

зачем это все?


 
StriderMan ©   (2006-08-03 16:52) [28]

ну вот такая вот задача.

если конкретно,
то есть табличка. в ней есть уникальное поле "код". и есть кпопочки +/- которыми код можно менять.


 
StriderMan ©   (2006-08-03 16:53) [29]


> зачем это все?


если знаете как это сделать проще, поделитесь, буду рад.


 
Dok   (2006-08-03 17:17) [30]


> то есть табличка. в ней есть уникальное поле "код". и есть
> кпопочки +/- которыми код можно менять.

т.е. на каждый пук пользователя лезем в базу?


 
Johnmen ©   (2006-08-03 17:28) [31]

Точно что-то не то в консерватории...:)


 
Ega23 ©   (2006-08-03 17:29) [32]

Если код может менять пользователь, то какое же это уникальное значение?


 
StriderMan ©   (2006-08-03 17:30) [33]


> Dok   (03.08.06 17:17) [30]
> Johnmen ©   (03.08.06 17:28) [31]

да, такая вот дурацкая система. Фичу не я придумал. в принципе на локальной базе работает быстро.


 
StriderMan ©   (2006-08-03 17:31) [34]


> Ega23 ©   (03.08.06 17:29) [32]
> Если код может менять пользователь, то какое же это уникальное
> значение?

а почему бы и нет? уникальное в пределах таблицы. Если пользователь пытается ввести неуникальное, то корректно ругаемся.


 
Ega23 ©   (2006-08-03 17:34) [35]

Я к тому, что ты его сам генерить должен.


 
StriderMan ©   (2006-08-03 17:36) [36]


> Ega23 ©   (03.08.06 17:34) [35]
> Я к тому, что ты его сам генерить должен.

я его и генерю при добавлении записи. но пользователь в праве его менять.


 
Ega23 ©   (2006-08-03 17:45) [37]


> я его и генерю при добавлении записи. но пользователь в
> праве его менять.


Непонятно. Честное слово, непонятно зачем такое поле нужно...


 
StriderMan ©   (2006-08-03 18:41) [38]


> Ega23 ©   (03.08.06 17:45) [37]

это поле называет КОД. Это код элемента в справочнике. Некий уникальный идентификатор, ПОНЯТНЫЙ и доступный пользователю.

вы с 1С знакомы?


 
Ega23 ©   (2006-08-03 18:48) [39]


> вы с 1С знакомы?


Нет.


> это поле называет КОД. Это код элемента в справочнике. Некий
> уникальный идентификатор, ПОНЯТНЫЙ и доступный пользователю.
>  


Я такие поля сам генерю. И нехрен пользователю их менять.


 
StriderMan ©   (2006-08-03 19:15) [40]


> И нехрен пользователю их менять

задачи товароучета сложно решать без возможности изменения идентификатора товара (кода, артикула, штрих-кода).
по крайней мере современный подход к этому вопросу требует такой возможности.



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

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.061 c
15-1158296765
wwwrr
2006-09-15 09:06
2006.10.08
44.5


2-1153836302
Eskimo
2006-07-25 18:05
2006.10.08
Вопрос по датам


15-1158235085
Чапаев
2006-09-14 15:58
2006.10.08
Delphi 2006 ETM. Что-то туплю.


1-1156409591
DelphiLexx
2006-08-24 12:53
2006.10.08
FormStyle=fsMdiChild и FormStyle=fsNormal отрисовыв. по разному?


9-1135469233
Аццкий_рыцарь:)
2005-12-25 03:07
2006.10.08
ГЛЮЧНОСТЬ В DELPHIX