Форум: "Базы";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];
ВнизВопрос по устройству SP в FireBird Найти похожие ветки
← →
Ega23 © (2007-11-30 12:26) [0]Усиленно читаю документацию, но может чего-то недопонял?
Дело в следующем: в 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;
?
← →
Ega23 © (2007-11-30 12:27) [1]
> Причём набор полей и их типы в таблицах не отличаются.
>
Поправка: Причём набор полей и их типы в таблицах отличаются.
← →
ЮЮ © (2007-11-30 12:33) [2]А в чем сермяжная правда такой ХП, когда даже не догадываешься какие поля следует ожидать в возвращаемом НД ?
← →
Ega23 © (2007-11-30 12:49) [3]
> А в чем сермяжная правда такой ХП, когда даже не догадываешься
> какие поля следует ожидать в возвращаемом НД ?
Ну, допустим, есть 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 перекрыты данной ХП.
← →
Ega23 © (2007-11-30 12:50) [4]Здесь вопрос, скорее, стиля работы. Вот был выработан при работе с MSSQL такой стиль. Было бы неплохо, если бы FB такой стиль поддерживала. Нет - ну тоже не беда, выработаю новый.
← →
PEAKTOP © (2007-11-30 14:01) [5]> Собственно вопрос: можно ли сделать подобную ХП для FB?
> т.е. чтобы в зависимости от переданного параметра мне возвращались
> разные НД с разными полями?
Выборку с разных таблиц в зависимости от имени параметра - можно, разные поля - нельзя, т.к. возвращаемые процедурой домены описываются при ее создании.
Например, есть у меня ХП, выбирающая субконто (элемент справочника) в зависимости от значения счета, т.е. для счета 661 (Украинский план счетов) это будет справочник работников, для счетов 361, 631, 362, 632 - Контрагенты, для счетов 91,92,93 -справочник "виды затрат". Все справочники унифицированы (т.е. есть обязательные поля ID и NAME).
CREATE DOMAIN DOMN$PSTRING AS VARCHAR(255) CHARACTER SET WIN1251 COLLATE WIN1251;
CREATE DOMAIN DOMN$INTEGER AS INTEGER;
COMMIT;
Текст самой ХП:
CREATE OR ALTER PROCEDURE PROC$GET_ACCOUNT_SUBCONTO (
Q_ACCOUNT_ID DOMN$INTEGER
)RETURNS(
ID DOMN$INTEGER
,NAME DOMN$PSTRING
)
AS
DECLARE VARIABLE P_REF_NAME DOMN$PSTRING;
DECLARE VARIABLE P_SQL DOMN$PSTRING;
BEGIN
-- ПОЛУЧАЕМ ИМЯ ТАБЛИЦЫ СПРАВОЧНИКА
SELECT FIRST 1 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 14:18) [6]ясно. Узнал что хотел, всем большое спасибо.
← →
wipr (2007-11-30 21:41) [7]Вопрос для PEAKTOP
Интересная процедурка. Но я не понял где объявляется P_SQL
← →
turbouser © (2007-11-30 21:55) [8]
> wipr (30.11.07 21:41) [7]DECLARE VARIABLE P_SQL DOMN$PSTRING;
← →
wipr (2007-11-30 21:56) [9]Спасибо
← →
atruhin © (2007-12-01 06:37) [10]> Интересная процедурка.
Очень осторожно нужно с такими процедурками обращаться.
Лучше всего, использовать только тогда, когда по другому никак.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c