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

Вниз

Вопрос по устройству 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1207726269
cvg
2008-04-09 11:31
2008.05.04
Помогите найти ошибку в небольшой функции!


15-1205868370
Ega23
2008-03-18 22:26
2008.05.04
А каким образом Delphi читает dfm?


2-1207665127
arinyshka
2008-04-08 18:32
2008.05.04
вставка и считывание картинки в бд ms sql


2-1207728682
rashkov
2008-04-09 12:11
2008.05.04
Последнии символы


15-1205857406
Guezt
2008-03-18 19:23
2008.05.04
дефицит информации по SDK. АСКОН-Компас