Страница 1 из 1

Значения переменных в хранимых процедурах

Добавлено: 11 апр 2005, 12:27
art_tms
Есть хранимая процедура, которая вызывает другую процедуру и передаёт данные через переменные.
Например:

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

Добавлено: 11 апр 2005, 12:56
kdv
Вроде бы днем письмо написано, не ночью...

CREATE PROCEDURE PR1(
)
AS
DECLARE VARIABLE GOD INTEGER;
DECLARE VARIABLE MES INTEGER;
begin
execute procedure PR2 (:GOD,:MES);
end;

как ты думаешь, почему в этих переменных вообще должно что то быть, кроме null? почему бы не мусор, из памяти?

Во второй процедуре локальные переменные нигде не упоминаются.
Может, ты путаешь - зачем тебе нужны локальные переменные, если у тебя есть входные? Или ты думаешь, что входные переменные транслируются в локальные???

Добавлено: 11 апр 2005, 13:21
art_tms
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 писал(а): Может, ты путаешь - зачем тебе нужны локальные переменные, если у тебя есть входные?
В том то и дело, что входные теряют значения