powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аналоги too_many_rows и no_data_found в Firebird
15 сообщений из 15, страница 1 из 1
Аналоги too_many_rows и no_data_found в Firebird
    #38765609
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
В Firebird работал крайне редко, в основном на Oracle. В связи с этим вопрос - есть ли аналоги too_many_rows и no_data_found в Firebird?
Как мне отловить ошибки, если таковые произошли в запросе?
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765615
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765777
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я читал это, но мне все равно непонятно... будет что-то подобное?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  select test 
     into a_
     from test
   where test = 1
 
when any do
  ...
end;


но как мне отличить no_data_found от too_many_rows, хотел через SQLCODE, но не нашел подобных кодов в http://firebirdsql.su/doku.php?id=gdscodes
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765790
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikно как мне отличить no_data_found от too_many_rows
no_data_found - нет в ФБ такой ошибки. Если запрос не возвращает данные, значит ничего нет, и это не ошибка.

При этом
Код: sql
1.
2.
3.
4.
  select test 
  from test
  where test = 1
  into :somevar


в somevar будет null. Отличить его от null в столбце test, если вернулась 1 запись, невозможно. Есть трюк - можно присвоить somevar до выполнения запроса какое-нибудь значение, которое точно не может быть ни в одном столбце test. Например
Код: sql
1.
2.
3.
4.
5.
6.
7.
somevar=-99999;
select test 
from test
where test = 1
into :somevar;
if (somevar = -99999) then -- запрос ничего не вернул
else - что-то вернулось



А вот если запрос в таком виде возвращает больше одной строки - будет явная ошибка multiple rows in singleton select , и ее уже можно обработать.
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765807
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

спасибо :)

а будет ли явная ошибка при операции insert - parent key not found?
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765812
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvОтличить его от null в столбце test, если вернулась 1 запись, невозможно.
IF (ROW_COUNT = 0) THEN
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765818
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikа будет ли явная ошибка при операции insert - parent key not found?
Если FK есть.
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38765966
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

спасибо, забыл.
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766016
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvaidynchikно как мне отличить no_data_found от too_many_rows
no_data_found - нет в ФБ такой ошибки. Если запрос не возвращает данные, значит ничего нет, и это не ошибка.

При этом
Код: sql
1.
2.
3.
4.
  select test 
  from test
  where test = 1
  into :somevar


в somevar будет null. Отличить его от null в столбце test, если вернулась 1 запись, невозможно.

В somevar будет то значение, которое было до выполнения этого запроса. Тоесть блок
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
execute block
  returns(a integer)
as
begin
  a = 1;
  select rdb$relation_id
    from rdb$database
    where 1 = 2
    into a;
  suspend;
end


вернет единицу.

У меня тут вопросс к знающим товарищам - если закомментировать строку "a = 1;", всегда ли в а будет null при выполнении такого запроса, или же лучше на это не закладываться и обнулять переменные самостоятельно. Тоесть, инициируются ли переменные null-ом неявно или нет?
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766021
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineТоесть, инициируются ли переменные null-ом неявно или нет?
Разве с иным поведением встречался? :)
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766027
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanmiwaonlineТоесть, инициируются ли переменные null-ом неявно или нет?
Разве с иным поведением встречался? :)
В подкорку забит анекдот о яблоках, поэтому переменным всегда присваиваю начальные значения. Иногда переменных бывает много и допускаю, что мог где-то что-то пропустить. Ну и то, что я ни разу с таким не сталкивался еще не значит, что такого нет. Если что-то работает, то еще не значит, что оно работает правильно ©
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766054
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineВ somevar будет то значение, которое было до выполнения этого запроса. Тоесть блок
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
execute block
  returns(a integer)
as
begin
  a = 1;
  select rdb$relation_id
    from rdb$database
    where 1 = 2
    into a;
  suspend;
end



вернет единицу.

У меня тут вопросс к знающим товарищам - если закомментировать строку "a = 1;", всегда ли в а будет null при выполнении такого запроса, или же лучше на это не закладываться и обнулять переменные самостоятельно. Тоесть, инициируются ли переменные null-ом неявно или нет?


в этом случае да. Но вот если вдруг случайно ты будешь выполнять запрос

Код: sql
1.
2.
3.
4.
  select rdb$relation_id
    from rdb$database
    where 1 = 2
    into a; 



в цикле, то переменную лучше явно обнулять перед началом запроса.
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766071
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineТоесть, инициируются ли переменные null-ом неявно или нет?В 2.5 точно инициализируются.
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766075
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНо вот если вдруг случайно ты будешь выполнять запрос

Код: sql
1.
2.
3.
4.
  select rdb$relation_id
    from rdb$database
    where 1 = 2
    into a; 



в цикле, то переменную лучше явно обнулять перед началом запроса.
Ну это понятно - в переменной останется значение из предыдущей итерации. Интересует больше такая полугипотетическая ситуация

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
var1 = null;
var2 = null;
...
varn = null;

select val1, val2, val3... valn, val_n+1
  from ...
  where ...
  into var1, var2, var3 ... varn, var_n+1;
И дальше идет какая-то работа со всеми этими var_x. При этом var_n+1 был добавлен позже и не проинициализирован null-ом по причине забывчивости. Вопрос состоит в том, может ли теоретически в var_n+1 появиться мусор (если не будут найдены данные по условию выборки), или же переменные и без моего участия инициализируются null-ами?
...
Рейтинг: 0 / 0
Аналоги too_many_rows и no_data_found в Firebird
    #38766077
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladmiwaonlineТоесть, инициируются ли переменные null-ом неявно или нет?В 2.5 точно инициализируются.
Спасибо. Некоторые процедуры можно будет подсократить :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аналоги too_many_rows и no_data_found в Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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