powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute statement + FB1.5
25 сообщений из 40, страница 1 из 2
execute statement + FB1.5
    #32646498
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
execute statement 'select BUILDING_ID from BUILDING where ' ||pWHERE into :pBUILDING_ID;
при таком вызове в ХП почему то не работает.
где pWHERE - строка условие(типа Street = ... and house = ...), которое формируется динамически. Я тут по форуму поискал, так вроде должно работать так:
execute statement 'select BUILDING_ID from BUILDING where STREET = ...' into :pBUILDING_ID;
но как тогда прикручивать изменяющийся where?
Я пробовал сначала весь запрос (до Into) делать в отдельную переменную типа
execute statement MySQL into :pBUILDING_ID
но так тоже не работает. Может кто сталкивался?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646592
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего пишет-то?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646890
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arithmetic overflow or division by zero has occured
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646948
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно не работает из за того что я так формирую условие:

if (iSTREET <> 0) then
pWHERE = 'STREET = ' || cast(:iSTREET as varchar(5));

вообще то все это для того чтобы проверять какие входящие параметры в ХП не нулевые, то они и должны учитываться в SQL запросе. Интересно, а нет ли в FB какой нибудь функции типа Oracl'овской Decode?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646950
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Castor
Код: plaintext
execute statement 'select BUILDING_ID from BUILDING where ' ||pWHERE into :pBUILDING_ID; 
при таком вызове в ХП почему то не работает.

А у меня работает.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646954
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dik76А у меня работает.
а у тебя условие pWhere какое?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646984
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор cast(:iSTREET as varchar(5));
И сколько символов может быть iSTREET ?
Если больше 5 (varchar(5)) - то работать и не будет!

Best regards,
Dnico.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646987
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
 if (iSTREET <>  0 ) then
pWHERE = 'STREET = ' || cast(:iSTREET as varchar( 5 )); 

Что то я это условие вообще не понял.. А если равно iSTREET = 0, тогда что?
И еще STREET - это числовое поле или строка? Если поиск по строке, то
Код: plaintext
pWHERE = 'STREET = ''' || cast(:iSTREET as varchar( 5 ))||''''; 
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32646993
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DnicoЕсли больше 5 (varchar(5)) - то работать и не будет!
нет, только 5 или меньше
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647001
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторArithmetic overflow or division by zero has occured

Тогда всю процедуру в студию ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647003
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CastorИнтересно, а нет ли в FB какой нибудь функции типа Oracl'овской Decode?Есть лучше - CASE
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647013
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dik76
iStreet это integer параметр (код улицы), который я передаю в ХП. Если я передаю туда 0 то он не должен учитываться
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647022
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pWHERE = ' STREET = 470 and HOUSE_NUM = 1 and BUILDING_NUM = 3 ';

pSQL = 'select BUILDING_ID from BUILDING where ' || pWHERE;

execute statement pSQL into :pBUILDING_ID;

почему то даже так не хочет
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647025
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При = 0 в
execute statement 'select BUILDING_ID from BUILDING where '
where будет лишнее или у тебя там еще парамметры есть?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647040
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяюсь к Dnico, процедуру в студию.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647042
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dik76
да нет это я проверяю, там есть другое условие, которое обязательно есть в where. Я уже попробовал просто складывать строки вручную (см. мой пост выше) и все равно.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647072
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Castor>Dik76
да нет это я проверяю, там есть другое условие, которое обязательно есть в where. Я уже попробовал просто складывать строки вручную (см. мой пост выше) и все равно.
А тип у BUILDING_ID и pBUILDING_ID одинаковый? Тут уже
обсуждалось, что даже если один smallint , а другой integer , то
будут проблемы.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647084
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set term /;
create procedure PROC_GET_BTI2
returns (pROOM_QTY smallint)
as
declare variable pBUILDING_ID integer;
declare variable pWHERE varchar(100);
declare variable pSQL varchar(250);
begin
pWHERE = ' STREET = 470 and HOUSE_NUM = 1 and BUILDING_NUM = 3 ';

pSQL = 'select BUILDING_ID from BUILDING where' || pWHERE;

execute statement pSQL into :pBUILDING_ID;

pROOM_QTY = :pBUILDING_ID;

SUSPEND;
end;/
set term ;/;
вот так наконец заработала, сейчас буду дальше разбираться
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647095
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Somebody2А тип у BUILDING_ID и pBUILDING_ID одинаковый? Тут уже
обсуждалось, что даже если один smallint , а другой integer , то
будут проблемы.
Да все типы передаваемых переменных совпадают, но видимо когда идет преобразование через cast, тогда все и портится. А как в этом случае правильно преобразовывать целое число для подстановки его в строку where?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647132
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Castor

Код: plaintext
1.
2.
if (iSTREET <>  0 ) then
pWHERE = 'STREET = ' || cast(:iSTREET as varchar( 5 ));
^^^^
Тут приведения типов ненужно.

Код: plaintext
1.
2.
if (iSTREET <>  0 ) then
pWHERE = 'STREET = ' || iSTREET
^^^^^
так тоже должно сработать.


execute statement 'select BUILDING_ID from BUILDING where ' ||pWHERE into :pBUILDING_ID;

попробуйте так, может сработает (если тип pBUILDING_ID integer):
execute statement 'select cast(BUILDING_ID as integer) from BUILDING where ' ||pWHERE into :pBUILDING_ID;

P.S. Может тут можно и без execute statement обойтись?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647147
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, дело не в cast у меня с ним работает без проблем.
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647156
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Somebody2
Как раз без cast'a только что попробовал - процедура компилируется, но при выполнении та же ошибка. А зачем приводить select cast(... , если поле которое я выбираю имеет тип integer?
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647161
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще такой способ без Execute Statment:
Код: plaintext
1.
2.
3.
4.
5.
6.
select BUILDING_ID from BUILDING 
where 
  (:iStreet is Null or Street = :iStreet) and
  (:iHouse is Null or House = :iHouse) and
  (:iFlat is Null or Flat = :iFlat) and ...
  ...
into :pBUILDING_ID;
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647177
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set term /;
create procedure PROC_GET_BTI
(
pSTREET integer,
pHOUSE_NUM integer,
pHOUSE_IDX char(1),
pBUILDING_NUM integer,
pBUILDING_IDX char(1),
pS_HOUSE_NUM integer,
pS_HOUSE_IDX char(1)
)
returns (pROOM_QTY smallint,
pAREA_COM numeric(5,1),
pAREA_DWELL numeric(5,1))
as
declare variable iSTREET integer;
declare variable pBUILDING_ID integer;
declare variable iHOUSE smallint;
declare variable iHOUSE_LIT char(1);
declare variable iKORP smallint;
declare variable iKORP_LIT char(1);
declare variable iSTROEN smallint;
declare variable iSTROEN_LIT char(1);

declare variable pWHERE varchar(50);
declare variable pSQL varchar(250);
begin
/* инициализация*/

iSTREET = 0;
pBUILDING_ID = 0;
iHOUSE = 0;
iHOUSE_LIT = '';
iKORP = 0;
iKORP_LIT = '';
iSTROEN = 0;
iSTROEN_LIT = '';

pWHERE = '';
pSQL = '';

/* присвоение переменных*/
iSTREET = :pSTREET;
iHOUSE = :pHOUSE_NUM;
iHOUSE_LIT = :pHOUSE_IDX;
iKORP = :pBUILDING_NUM;
iKORP_LIT = :pBUILDING_IDX;
iSTROEN = :pS_HOUSE_NUM;
iSTROEN_LIT = :pS_HOUSE_IDX;

if (iSTREET <> 0) then
pWHERE = 'STREET = ' || cast(:iSTREET as varchar(5));

if (iHOUSE <> 0) then
pWHERE = pWHERE || ' and HOUSE_NUM = ' || cast(:iHOUSE as varchar(5));

if (iHOUSE_LIT <> '') then
pWHERE = pWHERE || ' and HOUSE_IDX = ' || :iHOUSE_LIT;

if (iKORP <> 0) then
pWHERE = pWHERE || ' and BUILDING_NUM = ' || cast(:iKORP as varchar(5));

if (iKORP_LIT <> '') then
pWHERE = pWHERE || ' and BUILDING_IDX = ' || :iKORP_LIT;

if (iSTROEN <> 0) then
pWHERE = pWHERE || ' and S_HOUSE_NUM = ' || cast(:iSTROEN as varchar(5));

if (iSTROEN_LIT <> '') then
pWHERE = pWHERE || ' and S_HOUSE_IDX = ' || :iSTROEN_LIT;

/* pWHERE = ' STREET = 470 and HOUSE_NUM = 1 and BUILDING_NUM = 3 '; */

pSQL = 'select BUILDING_ID from BUILDING where' || pWHERE;

execute statement pSQL into :pBUILDING_ID;

pROOM_QTY = :pBUILDING_ID;
pAREA_COM = 0;
pAREA_DWELL = 0;

SUSPEND;
end;/
set term ;/;


это ХП. Переменные используются для проверки что мы передали, а что - нет. Улица (STREET) и №дома (HOUSE_NUM) - обязательны, остальные -нет.
в конце Area_Com и Area_Dwell = 0 (это потом будет доделываться). Room_Qty имеет тип smallint и ему присваивается integer - но это чтобы только попробовать
...
Рейтинг: 0 / 0
execute statement + FB1.5
    #32647188
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что запрос всегда одназначно возвращает одну строку?
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute statement + FB1.5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]