Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.

2011-08-21 Thread denixx baykin
Я что-то слишком назойлив стал :)
Но это вроде последнее, что останавливает от перехода на Firebird.

Есть таблица "sector", в неё посредством хранимой процедуры
вставляется или изменяется запись.

Итак, хранимая процедура в MySQL, как она есть:
CREATE DEFINER=`root`@`localhost` PROCEDURE `addOrChangeRecord`(
v BIGINT,
_id BIGINT,
segmentId INT,
socialId VARCHAR(25),
fullName VARCHAR(50),
photoUrl TINYTEXT,
registrationTime DATETIME,
_level INT,
sectorName VARCHAR(50),
x INT,
y INT,
caravanSpeed DOUBLE,
occupantUserId BIGINT,
sectorSkinTypeId BIGINT)
BEGIN
IF EXISTS (select 1 from `WarRules`.`sector` where id = _id)
THEN UPDATE `WarRules`.`sector` SET
`v` = v,
`id` = _id,
`segmentId` = segmentId,
`socialId` = socialId,
`fullName` = fullName,
`photoUrl` = photoUrl,
`registrationTime` = registrationTime,
`level` = _level,
`sectorName` = sectorName,
`x` = x,
`y` = y,
`caravanSpeed` = caravanSpeed,
`occupantUserId` = occupantUserId,
`sectorSkinTypeId` = sectorSkinTypeId
WHERE id=_id;
select CONCAT('ID: ', _id , ' FullName: ', fullName , ' Запись
обновлена.');
ELSE INSERT INTO `WarRules`.`sector` (
`v`,
`id`,
`segmentId`,
`socialId`,
`fullName`,
`photoUrl`,
`registrationTime`,
`level`,
`sectorName`,
`x`,
`y`,
`caravanSpeed`,
`occupantUserId`,
`sectorSkinTypeId`
) VALUES (
v,
_id,
segmentId,
socialId,
fullName,
photoUrl,
registrationTime,
_level,
sectorName,
x,
y,
caravanSpeed,
occupantUserId,
sectorSkinTypeId
);
select CONCAT('ID: ', _id , ' FullName: ', fullName , ' Запись
добавлена.');
END IF;
END

IBExpert
create or alter procedure ADDORCHANGERECORD (
"_V" bigint,
"_ID" bigint,
"_SEGMENTID" integer,
"_SOCIALID" varchar(25),
"_FULLNAME" varchar(50),
"_PHOTOURL" blob sub_type 1 segment size 255,
"_REGISTRATIONTIME" timestamp,
"_LEVEL" integer,
"_SECTORNAME" varchar(50),
"_X" integer,
"_Y" integer,
"_CARAVANSPEED" double precision,
"_OCCUPANTUSERID" bigint,
"_SECTORSKINTYPEID" bigint)
as
begin
if (EXISTS(select 1 from sector where id = "_ID"))
THEN
BEGIN
UPDATE sector SET
v = "_V",
id = "_ID",
segmentId = "_SEGMENTID",
socialId = "_SOCIALID",
fullName = "_FULLNAME",
photoUrl = "_PHOTOURL",
registrationTime = "_REGISTRATIONTIME",
level = "_LEVEL",
sectorName = "_SECTORNAME",
x = "_X",
y = "_Y",
caravanSpeed = "_CARAVANSPEED",
occupantUserId = "_OCCUPANTUSERID",
sectorSkinTypeId = "_SECTORSKINTYPEID"
WHERE id="_ID";
select CONCAT('ID: ', "_ID" , ' FullName: ', "_FULLNAME" , ' Запись
обновлена.');
END
ELSE
BEGIN
INSERT INTO sector (
v,
id,
segmentId,
socialId,
fullName,
photoUrl,
registrationTime,
level,
sectorName,
x,
y,
caravanSpeed,
occupantUserId,
sectorSkinTypeId
) VALUES (
"_V",
"_ID",
"_SEGMENTID",
"_SOCIALID",
"_FULLNAME",
"_PHOTOURL",
"_REGISTRATIONTIME",
"_LEVEL",
"_SECTORNAME",
"_X",
"_Y",
"_CARAVANSPEED",
"_OCCUPANTUSERID",
"_SECTORSKINTYPEID"
);
select CONCAT('ID: ', "_ID" , ' FullName: ', "_FULLNAME" , ' Запись
добавлена.');
END
end

Если возле  ' Запись обновлена.'); оставить символ ";", то IBExpert
указывает на окончание этой строки. Если точку с запятой убрать, то
указывает на следующий END.
Не пойму, что он от меня тут хочет. Дальше я пока не правил сильно.
Правильно ли я использую переменные, передаваемые в хранимую
процедуру?
"_ID", с кавычками?


RE: Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.

2011-08-21 Thread Михаил Викторович
Все не правильно
Пример: наверное дальше сам сообразишь.

CREATE OR ALTER PROCEDURE COPYORDER (
fromcdorder integer,
tocdorder integer,
flags integer = 0)
as
declare variable cdthing integer;
declare variable cdmsh integer;
declare variable comment varchar(255);
declare variable price double precision;
declare variable nds double precision;
declare variable nds_p double precision;
declare variable pricesumm double precision;
declare variable cdasklist integer;
declare variable cellcount integer;
declare variable fromcdmainal integer;
declare variable tocdmainal integer;
declare variable addhand integer;
declare variable c integer;
declare variable cdmain integer;
declare variable oldcode char(6);
declare variable tarif_p double precision;
declare variable tarif_summ double precision;
declare variable fromcdspecver integer;
declare variable tocdspecver integer;
declare variable cdmain2 integer;
declare variable howmany double precision;
declare variable numcell varchar(100);
declare variable cdmaincell integer;
declare variable fromcdspecref integer;
declare variable tocdspecref integer;
declare variable fromcdspecvercell integer;
declare variable tocdspecvercell integer;
declare variable options integer;
declare variable fromvalue0 varchar(255);
declare variable tovalue0 varchar(255);
declare variable cdmain1 integer;
declare variable cdchk integer;
declare variable value1 varchar(255);
declare variable value2 varchar(255);
declare variable from_annotate blob sub_type 1 segment size 80;
declare variable obozncell varchar(100);
declare variable dogorder varchar(100);
declare variable cdasklistfield integer;
declare variable cell integer;
declare variable cdspecver integer;
declare variable cdspecvernew integer;
declare variable cdnmclparam integer;
declare variable cdspecref integer;
begin
  select cdThing, cdMsh, HowMany, Comment, Price, NDS, NDS_P, cdMainAL,
 PriceSumm, cdAskList, CellCount, Options, Annotate
from OrderRef
   where cdOrder = :FromcdOrder
into :cdThing, :cdMsh, :HowMany, :Comment, :Price, :NDS, :NDS_P,
:FromcdMainAL,
:PriceSumm, :cdAskList, :CellCount, :Options, :From_Annotate;

  delete from OrderTarifList where cdOrder = :TocdOrder;

  for select cdMain, Tarif_P, Tarif_Summ
from OrderTarifList
   where cdOrder = :FromcdOrder
into :cdMain, :Tarif_P, :Tarif_Summ
  do
insert into OrderTarifList (cdOrder, cdMain, Tarif_P, Tarif_Summ)
  values (:TocdOrder, :cdMain, :Tarif_P, :Tarif_Summ);

  update OrderRef
 set cdThing = :cdThing,
 cdMsh = :cdMsh,
 HowMany = :HowMany,
 Comment = :Comment,
 Price = :Price,
 NDS = :NDS,
 NDS_P = :NDS_P,
 PriceSumm = :PriceSumm,
 cdAskList = :cdAskList,
 CellCount = :CellCount,
 Options = :Options,
 Annotate = :From_Annotate
   where cdOrder = :TocdOrder;

  Delete from AskListMainFields where cdOrder = :TocdOrder;

end




Re: Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.

2011-08-21 Thread Vlad Khorsun

"denixx baykin" ...

Я что-то слишком назойлив стал :)
Но это вроде последнее, что останавливает от перехода на Firebird.


   Без чтения базовой документации или хотя бы примеров - ничего не получится.
SELECT в воздух не делается. Разберись сначала с конструкциями PSQL.

--
Хорсун Влад