Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1206152154
Morpheuz
2008-03-22 05:15
2008.05.04
Цена делфи


2-1207414548
Alexey
2008-04-05 20:55
2008.05.04
Не получается SQL-запрос


15-1206133335
Lets
2008-03-22 00:02
2008.05.04
Какие есть версии делфи?


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


15-1205303786
SKIPtr
2008-03-12 09:36
2008.05.04
Помогите выбрать вентилятор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский