Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2012, 05:44   #1
Ericnex
Форумчанин
 
Регистрация: 07.04.2010
Сообщений: 218
По умолчанию Хранимая процедура выбора

Создать процедуру выбора, которая осуществляет выборку тех записей из таблицы Название товара, где Количество поступлений товара превышает среднее значение поступлений товара по всем магазинам.

В InterBase прописываю процедуру
Код:
ALTER PROCEDURE P_AVGKOLVO 
RETURNS
(
  OPAVGKOLVO FLOAT
)
AS
begin
select avg(Kol_vo) from Partia into: OpAvgKolvo;
end
 ^


ALTER PROCEDURE P_NAMEMAG 
RETURNS
(
  OPNAMEMAG VARCHAR(20)
)
AS
declare variable AvgKol float;
begin
execute procedure P_AvgKolvo returning_values :AvgKol;
for
select Date_p from Partia where Kol_vo > :AvgKol
into: OpNameMag
do suspend;
end
Кажется что-то делаю неправильно исправьте где надо.

И еще: как правильно задать эту процедуру через Delphi, делаю как-то так, кажется тоже не совсем то

Код:
procedure TForm1.Button8Click(Sender: TObject);
begin
DM.StoredProc2.Prepare;
DM.StoredProc2.ParamByName('Avg_kol').Value:=Edit6.Text;
Dm.StoredProc1.ExecProc;
Label1.Caption:=DM.StoredProc2.ParamByName('opNameMag').Value;
end;
Ericnex вне форума Ответить с цитированием
Старый 04.09.2012, 07:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
do suspend;
Это зачем?
Как я понимаю - твоя процедура должна создать временную таблицу, куда и будут перекачиваться данные из запроса.
А после ее вызова из программы штатными средствами эту таблицу запрашивать
Примера нет но что-то типа:
Код:
execute procedure P_AvgKolvo returning_values :AvgKol;
delete from buf
insert into buf
 select Date_p from Partia where Kol_vo > :AvgKol
где buf - таблица с одним полем

А в клиенте делаешь запрос select * from buf и получай в цикле данные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2012, 07:44   #3
Ericnex
Форумчанин
 
Регистрация: 07.04.2010
Сообщений: 218
По умолчанию

Цитата:
Как я понимаю - твоя процедура должна создать временную таблицу, куда и будут перекачиваться данные из запроса.
А после ее вызова из программы штатными средствами эту таблицу запрашивать
Скорее мне надо просто оставить несколько записей в таблице которые соответствуют данному условию.

Код:
select Date_p from Partia where Kol_vo > :AvgKol
Здесь я выбираю одно поле Date, а как сделать именно выборку некоторого количества записей
Ericnex вне форума Ответить с цитированием
Старый 04.09.2012, 09:47   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от Ericnex Посмотреть сообщение
Скорее мне надо просто оставить несколько записей в таблице которые соответствуют данному условию.
так может тогда проче сделать DELETE всем остальным записям оставив только нужные?
Цитата:
Код:
select Date_p from Partia where Kol_vo > :AvgKol
Здесь я выбираю одно поле Date, а как сделать именно выборку некоторого количества записей
вот тут не понял .. как-то поточнее можно?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 04.09.2012, 09:56   #5
Ericnex
Форумчанин
 
Регистрация: 07.04.2010
Сообщений: 218
По умолчанию

Цитата:
так может тогда проче сделать DELETE всем остальным записям оставив только нужные?
Скорее здесь подразумевается именно создание подобной процедуры выбора, но не с удалением а скорее с отсечением записей и потом с возможностью их вернуть

Цитата:
вот тут не понял .. как-то поточнее можно?
Здесь я понял здесь вместо поля должно быть значение первичного ключа.

Если можно то приведите код с самого начала, как бы вы это сделали.
Ericnex вне форума Ответить с цитированием
Старый 04.09.2012, 10:27   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

хм ... тогда другой вопрос
а не проще ли сделать 1 представление вместо 2х процедур с примерно таким текстом:
Код:
select * from Partia where Kol_vo > (select avg(Kol_vo) from Partia)
и потом просто делать выборку из этого представления
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 04.09.2012 в 11:21.
Yurk@ вне форума Ответить с цитированием
Старый 04.09.2012, 10:28   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что мешает так сделать, соответственно и выходные параметры добавить
Код:
for
select Date_p,Pole1,..,PoleN  from Partia where Kol_vo > :AvgKol
into :OpNameMag,:Pole1,..,:PoleN
Обращение
Код:
SELECT * FROM P_NAMEMAG
ADD

Вариант предложенный Yurk@ вообще можно без хранимых процедур
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.09.2012, 10:56   #8
Ericnex
Форумчанин
 
Регистрация: 07.04.2010
Сообщений: 218
По умолчанию

Вроде разобрался вот с этим
Цитата:
а не проще ли сделать 1 представление вместо 2х процедур с примерно таким текстом:
Код:

select * from Partia where Kol_vo > (select avg(Kol_vo) from Partia)

и потом просто делать выборку из этой процедуры
Это делается на сервере? Если да то как полностью будет выглядеть код?

Как через кнопку в Delphi можно сделать выборку?
Ericnex вне форума Ответить с цитированием
Старый 04.09.2012, 11:03   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

1. можно (представлением): на сервере
Код:
create or alter view v_vibor
as
select * from Partia where Kol_vo > (select avg(Kol_vo) from Partia)
и в дельфи на кнопке:
Код:
Query.Close;
Query.SQL.Text:='SELECT * FROM v_vibor';
Query.Open;
2. а можно и напрямую с дельфи:
Код:
Query.Close;
Query.SQL.Text:='select * from Partia where Kol_vo > (select avg(Kol_vo) from Partia)';
Query.Open;
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 04.09.2012 в 11:08.
Yurk@ вне форума Ответить с цитированием
Старый 04.09.2012, 11:21   #10
Ericnex
Форумчанин
 
Регистрация: 07.04.2010
Сообщений: 218
По умолчанию

Цитата:
2. а можно и напрямую с дельфи:
Код:

Query.Close;
Query.SQL.Text:='select * from Partia where Kol_vo > (select avg(Kol_vo) from Partia)';
Query.Open;
Такой вариант не работает. Ошибка выходит.
Изображения
Тип файла: jpg Безымянный.jpg (33.5 Кб, 16 просмотров)
Ericnex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранимая процедура Jrcfyf БД в Delphi 1 14.02.2012 18:45
Хранимая процедура Ellkat SQL, базы данных 0 22.05.2011 17:02
Хранимая процедура. Cartman18 БД в Delphi 21 08.05.2010 18:56
хранимая процедура serg369 SQL, базы данных 4 07.02.2010 14:33
Хранимая процедура. nimf БД в Delphi 2 22.04.2008 13:16