Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-30530
Nox
2003-03-24 10:49
2003.04.10
Visual Assembler


1-30360
Rafik
2003-03-26 16:01
2003.04.10
Отчет постранично не распечатать


1-30418
dmk
2003-03-27 00:41
2003.04.10
Перехват перерисовки окна?


14-30519
Феликс
2003-03-23 22:36
2003.04.10
Упражнения для развития дыхалки


1-30390
mask
2003-03-29 19:32
2003.04.10
Open API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский