Форум: "Базы";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизMultiple rows in singleton select Найти похожие ветки
← →
Jaxtor (2003-03-20 11:28) [0]Уважаемые мастера!
У меня есть хранимая процедура для IB 6.0.
Я ее отлаживаю через IB Expert. Во время отладки (Step over)
она все свои значения в раздел Results отладчика выводит правильно.
Но при запуске процедуры(Run) через IB Expert или Delphi выдает ошибку:
multiple rows in singleton select.
Что тут может быть?
Если хотите могу привести исходный код.
← →
Senator (2003-03-20 11:30) [1]Приведи код
← →
Fareader (2003-03-20 11:31) [2]Исхоный код конечно привести желательно, но тут и так понятно - когда возвращаешь запись ставь Suspend и все как рукой снимет :)
← →
zacho (2003-03-20 11:33) [3]Приводи код.
А вообще такая ошибка означает, что выбирается несколько записей, там, где должна быть одна. Например, какой-нибудь SELECT .. FROM ... INTO ... возвращает больше одной записи
← →
Jaxtor (2003-03-20 11:33) [4]Вот он, код:
CREATE PROCEDURE SNAKL_PROC (
NAKLID INTEGER)
RETURNS (
PN VARCHAR(63),
PRODUCT VARCHAR(255),
COUNTRYNAME INTEGER,
GTD VARCHAR(32),
SN VARCHAR(32),
QUANT INTEGER,
WARRANTY INTEGER,
PR$ DOUBLE PRECISION,
NAKLID_VAR INTEGER)
AS
begin
for select saveprod.pn,saveprod.product,savepr_atr.countryid,savepr_atr.gtd, SerialNo.serialno,stockitem.quantity,naklitem.warantyid, naklitem.naklitemid from saveprod,savepr_atr,serialNo,stockitem,naklitem
where (Savepr_atr.saveprodid=saveprod.saveprodid) and (SerialNo.saveprod_atrid=savepr_atr.saveprod_atrid) and (Stockitem.saveprod_atrid=savepr_atr.saveprod_atrid)
and (NaklItem.saveprod_atrid=Savepr_atr.saveprod_atrid) and (NaklId=:NaklID) into PN, Product, CountryName, GTD,sn,quant,warranty, NAKLID_VAR
do
begin
select NaklSum.sum_value from NaklSum,NaklItem where (NaklSum.naklitemid=:NAKLID_VAR) and (NaklSum.sumid=1) into :PR$;
suspend;
end
end
← →
Jaxtor (2003-03-20 11:35) [5]zacho> Но ведь через отладчик все работает!
← →
Соловьев (2003-03-20 11:37) [6]возможно ты передаешь параметр который NULL ...
← →
Jaxtor (2003-03-20 11:39) [7]Просто я не понимаю: через отладчик все работает, он выдает правильный набор данных, а через Run не получается.
← →
Fareader (2003-03-20 11:40) [8]Я что-то не пойму - ты объвил кучу переменных, а возвращаешь только одну - :PR$ зачем остальные? Надо делать так:
for select saveprod.pn,saveprod.product,savepr_atr.countryid,savepr_atr.gtd, SerialNo.serialno,stockitem.quantity,naklitem.warantyid, naklitem.naklitemid from saveprod,savepr_atr,serialNo,stockitem,naklitem
where (Savepr_atr.saveprodid=saveprod.saveprodid) and (SerialNo.saveprod_atrid=savepr_atr.saveprod_atrid) and (Stockitem.saveprod_atrid=savepr_atr.saveprod_atrid)
and (NaklItem.saveprod_atrid=Savepr_atr.saveprod_atrid) and (NaklId=:NaklID) into PN, Product, CountryName, GTD,sn,quant,warranty, NAKLID_VAR
suspend;
do
begin
select NaklSum.sum_value from NaklSum,NaklItem where (NaklSum.naklitemid=:NAKLID_VAR) and (NaklSum.sumid=1) into :PR$;
suspend;
end
← →
Соловьев (2003-03-20 11:41) [9]я тоже когда-то на это напоролся, тоже в отладчике смотрел все нормально, как только так запускаешь, так сразу ошибка... Вроде тогда решил эту проблему, приведением входного параметра к типу...
← →
zacho (2003-03-20 11:42) [10]
> Jaxtor © (20.03.03 11:35)
> zacho> Но ведь через отладчик все работает!
Отладчик не есть IB :), мало ли что через него работает :)
Посмотрел твой код, вроде все правильно, но подозреваю, что неправильно связываются таблицы. Попробуй переделать через явный JOIN или явно указывай алиасы таблиц во FROM. Кстати, точно не помню, но вроде бы в какой-то версии IB был баг, проявляющийся если в запросе алиас таблицы совпадал с ее названием.
← →
zacho (2003-03-20 11:43) [11]
> Fareader © (20.03.03 11:40)
Так делать не надо
← →
Jaxtor (2003-03-20 11:44) [12]>Fareader
>GTD,sn,quant,warranty, NAKLID_VAR
>suspend;
>do
А где do перед suspend?
← →
Соловьев (2003-03-20 11:45) [13]параметра того который работает в теле цыкла...
← →
Fareader (2003-03-20 11:46) [14]Хотя изначально ХП неправильно спроектирована, может так:
for select saveprod.pn,saveprod.product,savepr_atr.countryid,savepr_atr.gtd,SerialNo.serialno,stockitem.quantity,naklitem.warantyid, naklitem.naklitemid
from saveprod, savepr_atr, serialNo, stockitem, naklitem
where
(Savepr_atr.saveprodid=saveprod.saveprodid) and (SerialNo.saveprod_atrid=savepr_atr.saveprod_atrid) and (Stockitem.saveprod_atrid=savepr_atr.saveprod_atrid) and (NaklItem.saveprod_atrid=Savepr_atr.saveprod_atrid) and (NaklId=:NaklID)
(NaklSum.naklitemid=naklitem.naklitemid) and (NaklSum.sumid=1)
into PN, Product, CountryName, GTD,sn,quant,warranty, NAKLID_VAR, PR$;
do
suspend;
end
Так пожалуй правильнее
← →
Jaxtor (2003-03-20 12:40) [15]Вот немножко изменил код, чтобы проблема была яснее, что мне
нужно сделать:
CREATE PROCEDURE SNAKL_PROC (
NAKLID INTEGER)
RETURNS (
PN VARCHAR(63),
PRODUCT VARCHAR(255),
COUNTRYNAME INTEGER,
GTD VARCHAR(32),
SN VARCHAR(32),
QUANT INTEGER,
WARRANTY INTEGER,
PR$ DOUBLE PRECISION,
PRR DOUBLE PRECISION,
NAKLID_VAR INTEGER)
AS
begin
for select sp.pn,sp.product,satr.countryid,satr.gtd, srn.serialno,si.quantity,ni.warantyid, ni.naklitemid from saveprod sp,savepr_atr satr,serialNo srn,stockitem si,naklitem ni
where (satr.saveprodid=sp.saveprodid) and (srn.saveprod_atrid=satr.saveprod_atrid) and (si.saveprod_atrid=satr.saveprod_atrid)
and (Ni.saveprod_atrid=Satr.saveprod_atrid) and (NaklId=:NaklID) into PN, Product, CountryName, GTD,sn,quant,warranty, NAKLID_VAR
do
begin
select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR) and (ns.sumid=1) into :PR$;
select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR) and (ns.sumid=11) into :PRR;
suspend;
end
end
Стал использовать псевдонимы...
Ведь если логически рассуждать, у меня все должно работать.
А получается наоборот.
← →
Соловьев (2003-03-20 12:43) [16]
> select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR)
> and (ns.sumid=1) into :PR$;
> select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR)
> and (ns.sumid=11) into :PRR;
:NAKLID_VAR точно не NULL ???
← →
Jaxtor (2003-03-20 12:48) [17]У NAKLID_VAR не бывает значения NULL.
← →
zacho (2003-03-20 12:51) [18]Все-таки похоже, что в одной из связываемых таблиц у тебя находяться несколько записей, удовлетворяющих условию, вместо одной. Надеюсь, связываешь по PK или UNIQUE ?
← →
Jaxtor (2003-03-20 12:54) [19]Название у PK содержит буквы id, например, NAKLID.
← →
zacho (2003-03-20 13:01) [20]
> select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR)
> and (ns.sumid=1) into :PR$;
> select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR)
> and (ns.sumid=11) into :PRR;
Похоже, что дело в одном из этих двух select"ов. Проверь, действительно ли они возвращают только одну запись. И еще, непонятно зачем в этих запросах NaklItem ni, имхо, нафиг не нужно, в WHERE все равно не участвует
← →
ЮЮ (2003-03-21 08:07) [21]Только запрос типа
select MAX(ns.sum_value) from ...
или
select SUM(ns.sum_value) from ...
обязательно вернёт ОДНУ запись, твои же запросы ориентируются на то, что запись ДОЛЖНА БЫТЬ одна, но НЕ ОБЯЗАНА, если нет уникального ключа по полям (naklitemid, sumid)
Кстати, а что мешает составить запрос, м посмотреть, нет ли таких строк?
← →
zacho (2003-03-21 10:26) [22]
> zacho © (20.03.03 11:42)
>
> Посмотрел твой код, вроде все правильно
Че-то я вчера долго тормозил .. :-(
Блин, сразу надо было заметить, что запрос
select ns.sum_value from NaklSum ns,NaklItem ni where (ns.naklitemid=:NAKLID_VAR) and (ns.sumid=1) into :PR$;
вернет столько записей, сколько в таблице NaklItem.
Вот отсюда и ошибка
← →
PAV (2003-03-21 19:24) [23]Однозначно, хранимая процедура возвращает больше одной записи вместо одной. Выход либо в правке текста процедуры, либо в "правильности данных".
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c