Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по устройству 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 VARIABLE
P_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]


> Причём набор полей и их типы в таблицах не отличаются.
>


Поправка: Причём набор полей и их типы в таблицах отличаются.


Наверх

Титульная страница Поиск, карта сайта Написать письмо