![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по устройству SP в FireBird [FireBird]
Ega23 © (2007-11-30 12:26:00)Усиленно читаю документацию, но может чего-то недопонял?
Дело в следующем: в MSSQL я могу создать ХП такого вида:
create procedure S_MyProc
@ActNam varchar(32)='NONE'
AS
if @actNam='T1'
begin
Select * from Table1;
Goto Fin;
end;
if @actNam='T2'
begin
Select * from Table2
Goto Fin;
end;
Fin :
return(0)
Т.е., вызвав данную процедуру с @actNam='T1' я получаю все записи таблицы1, с параметром Т2 - из таблицы2. Причём набор полей и их типы в таблицах не отличаются.
Собственно вопрос: можно ли сделать подобную ХП для FB?
т.е. чтобы в зависимости от переданного параметра мне возвращались разные НД с разными полями?
Или все строго
FOR
SELECT COL1, COL2 from Table1
INTO :COL1, :COL2
DO
BEGIN
SUSPEND;
END;
?
atruhin (2007-12-01 06:37:00) [1]> Интересная процедурка.
Очень осторожно нужно с такими процедурками обращаться.
Лучше всего, использовать только тогда, когда по другому никак.
wipr (2007-11-30 21:56:00) [2]Спасибо
turbouser (2007-11-30 21:55:00) [3]
> wipr (30.11.07 21:41) [7]
DECLARE VARIABLE P_SQL DOMN$PSTRING;
wipr (2007-11-30 21:41:00) [4]Вопрос для PEAKTOP
Интересная процедурка. Но я не понял где объявляется P_SQL
Ega23 (2007-11-30 14:18:00) [5]ясно. Узнал что хотел, всем большое спасибо.
PEAKTOP (2007-11-30 14:01:00) [6]> Собственно вопрос: можно ли сделать подобную ХП для FB?
> т.е. чтобы в зависимости от переданного параметра мне возвращались
> разные НД с разными полями?
Выборку с разных таблиц в зависимости от имени параметра - можно, разные поля - нельзя, т.к. возвращаемые процедурой домены описываются при ее создании.
Например, есть у меня ХП, выбирающая субконто (элемент справочника) в зависимости от значения счета, т.е. для счета 661 (Украинский план счетов) это будет справочник работников, для счетов 361, 631, 362, 632 - Контрагенты, для счетов 91,92,93 -справочник "виды затрат". Все справочники унифицированы (т.е. есть обязательные поля ID и NAME).
CREATE DOMAINDOMN$PSTRING AS VARCHAR(255) CHARACTER SETWIN1251 COLLATEWIN1251;
CREATE DOMAINDOMN$INTEGER AS INTEGER;
COMMIT;
Текст самой ХП:
CREATE OR ALTER PROCEDUREPROC$GET_ACCOUNT_SUBCONTO (
Q_ACCOUNT_ID DOMN$INTEGER
) RETURNS(
ID DOMN$INTEGER
,NAME DOMN$PSTRING
)
AS
DECLARE VARIABLEP_REF_NAME DOMN$PSTRING;
DECLARE VARIABLEP_SQL DOMN$PSTRING;
BEGIN
-- ПОЛУЧАЕМ ИМЯ ТАБЛИЦЫ СПРАВОЧНИКА
SELECT FIRST1 B.REFERENCE_NAME
FROM REFERENCE_BUHG_ACCOUNTS B
WHERE (B.ID = :Q_ACCOUNT_ID)
INTO :P_REF_NAME;
-- ЕСЛИ ИМЯ ТАБЛИЦЫ СПРАВОЧНИКА НЕ УКАЗАНО - ВЫХОД ИЗ ПРОЦЕДУРЫ
IF( (:P_REF_NAME IS NULL) OR(:P_REF_NAME = '') ) THEN
BEGIN
ID = -1;
NAME = '';
SUSPEND;
EXIT;
END
-- ФОРМИРУЕМ СКРИПТ ВЫБОРКИ ИЗ ТАБЛИЦЫ
P_SQL = 'SELECT T.ID, T.NAME FROM '||:P_REF_NAME||' T ORDER BY T.ID ';
-- ВЫБИРАЕМ ЭЛЕМЕНТЫ СПРАВОЧНИКА
FOR EXECUTE STATEMENT:P_SQL INTO:ID, :NAME DO
SUSPEND;
END
Ega23 (2007-11-30 12:50:00) [7]Здесь вопрос, скорее, стиля работы. Вот был выработан при работе с MSSQL такой стиль. Было бы неплохо, если бы FB такой стиль поддерживала. Нет - ну тоже не беда, выработаю новый.
Ega23 (2007-11-30 12:49:00) [8]
> А в чем сермяжная правда такой ХП, когда даже не догадываешься
> какие поля следует ожидать в возвращаемом НД ?
Ну, допустим, есть 2 таблицы : ImageTypes и Images. В них храняться всяческие иконки, ипользуемые в приложении. Если очень грубо, то каждая запись в ImageTypes - суть TImageList, а все записи из Images с данным ImgTypeID - суть набор изображений в TImageList.
Обычно я создаю одну ХП, в которой описана вся бизнес-логика по работе с данными таблицами:
Print 'S_ImageProc - процедура для работы с изображениями'
go
if exists (select * from sysobjects where id = object_id(N'[S_ImageProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_ImageProc]
GO
CREATE PROCEDURE S_ImageProc
@ActNam varchar(32)='NONE',
-- ImageTyps
@ImgTypCod int =-1,
@ImgTypNam varchar(64) ='',
........
-- Images
@ImgID int =-1,
@ImgNam varchar(64) ='',
@ImgData image =NULL,
@Debug int =0
As
Set NoCount ON;
Set @Result=0;
Set @ActNam=Upper(LTrim(RTrim(@ActNam)));
if @ActNam='IMAGETYPS.SEL'
begin
Set Nocount OFF;
Select IT.*
from ImageTyps IT
where (@ImgTypCod=-1 or IT.ImgTypCod=@ImgTypCod) and
(@ImgTypMsk=255 or IT.ImgTypMsk=@ImgTypMsk)
Order By ImgTypOrd;
Goto Fin;
end;
if @ActNam='IMAGETYPS.ADD'
begin
if @ImgTypCod=-1
Select @ImgTypCod=IsNull(Max(ImgTypCod)+1, 1) from ImageTyps;
Insert into ImageTyps(ImgTypCod, ImgTypNam, ImgTypLab, ImgTypOrd,
ImgTypMsk, ImgTypNot, ImgTypWidth, ImgTypHeight)
Values (@ImgTypCod, @ImgTypNam, @ImgTypLab, @ImgTypOrd,
@ImgTypMsk, @ImgTypNot, @ImgTypWidth, @ImgTypHeight);
Select @Result=@ImgTypCod;
if @SelOut=1
begin
Select Result=@Result;
end;
Goto Fin;
end;
if @ActNam='IMAGETYPS.DEL'
begin
if @CascadeFl=1
exec S_ImageProc @ActNam='IMAGES.DEL', @ImgTypCod=@ImgTypCod, @SelOut=0;
Delete ImageTyps where ImgTypCod=@ImgTypCod;
Select @Result=@ImgTypCod;
if @SelOut=1
begin
Select Result=@Result;
end;
Goto Fin;
end;
fin:
set nocount off;
return(@result);
GO
Код приблизительный и неполный. Смысл такой, что любые действия с Images и Imagetypes перекрыты данной ХП.
ЮЮ (2007-11-30 12:33:00) [9]А в чем сермяжная правда такой ХП, когда даже не догадываешься какие поля следует ожидать в возвращаемом НД ?
Ega23 (2007-11-30 12:27:00) [10]
> Причём набор полей и их типы в таблицах не отличаются.
>
Поправка: Причём набор полей и их типы в таблицах отличаются.