Есть хранимая процедура, которая вызывает другую процедуру и передаёт данные через переменные.
Например:
CREATE PROCEDURE PR1(
)
AS
DECLARE VARIABLE GOD INTEGER;
DECLARE VARIABLE MES INTEGER;
begin
execute procedure PR2 (:GOD,:MES);
end;
CREATE PROCEDURE PR2(
GOD INTEGER,
MES INTEGER
)
AS
DECLARE VARIABLE GOD2 INTEGER;
DECLARE VARIABLE MES2 INTEGER;
begin
INSERT INTO TBL(MS, GD)
VALUES (:MES, :GOD);
end;
В базу TBL заносяться значения null, хотя в переменных первой процедуры значения точно отличные от null.
Если же перед вставкой в PR2 локальным переменным присвоить значения входным и локальные в базу, то всё нормально.
MES2=:MES;
GOD2=:GOD;
INSERT INTO TBL(MS, GD)
VALUES (:MES2, :GOD2);
Выходит нужно дублировать входные и локальные переменные и перед вставкой выравнивать? Это нормально?
А у меня переменных около 15 ...
Firebird 1.5.4731
Значения переменных в хранимых процедурах
Вроде бы днем письмо написано, не ночью...
CREATE PROCEDURE PR1(
)
AS
DECLARE VARIABLE GOD INTEGER;
DECLARE VARIABLE MES INTEGER;
begin
execute procedure PR2 (:GOD,:MES);
end;
как ты думаешь, почему в этих переменных вообще должно что то быть, кроме null? почему бы не мусор, из памяти?
Во второй процедуре локальные переменные нигде не упоминаются.
Может, ты путаешь - зачем тебе нужны локальные переменные, если у тебя есть входные? Или ты думаешь, что входные переменные транслируются в локальные???
CREATE PROCEDURE PR1(
)
AS
DECLARE VARIABLE GOD INTEGER;
DECLARE VARIABLE MES INTEGER;
begin
execute procedure PR2 (:GOD,:MES);
end;
как ты думаешь, почему в этих переменных вообще должно что то быть, кроме null? почему бы не мусор, из памяти?
Во второй процедуре локальные переменные нигде не упоминаются.
Может, ты путаешь - зачем тебе нужны локальные переменные, если у тебя есть входные? Или ты думаешь, что входные переменные транслируются в локальные???
Видно вопрос не понял, видно я плохо задал ...kdv писал(а): как ты думаешь, почему в этих переменных вообще должно что то быть, кроме null? почему бы не мусор, из памяти?
Если запустить процедуру PR1
execute procedure pr1 (1, 2005), то
в базу из второй процедуры значения 1 и 2005 не попадут, а если вторая процедура будет вида:
Код: Выделить всё
CREATE PROCEDURE PR2(
GOD INTEGER,
MES INTEGER
)
AS
DECLARE VARIABLE GOD2 INTEGER;
DECLARE VARIABLE MES2 INTEGER;
begin
-- локальные = входные
MES2=:MES;
GOD2=:GOD;
INSERT INTO TBL(MS, GD) -- работает
VALUES (:MES2, :GOD2);
/*
если
INSERT INTO TBL(MS, GD) -- не работает: :MES и :GOD - null
VALUES (:MES, :GOD);
*/
end;
В том то и дело, что входные теряют значенияkdv писал(а): Может, ты путаешь - зачем тебе нужны локальные переменные, если у тебя есть входные?