powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Multiple rows in singleton select
25 сообщений из 45, страница 1 из 2
Multiple rows in singleton select
    #38616472
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть селективная процедура. Вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
FOR
  SELECT
    .......
  FROM
    .......
  INTO
   ..
DO BEGIN
  ......
  SUSPEND;
END


При ее выполнении получаю ошибку "Multiple rows in singleton select". Если процедуру перекомпилировать, ничего в ней не изменяя, ошибка пропадает. Backup/Restore (даже с ключем -va) ошибку не убирают. Ошибка всегда проявляется на новой инсталляционной базе. Она всегда разворачивается из бэкапа.

Сервер IB XE3.

У кого-нибудь есть идеи, что это какое и как с этим бороться?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616487
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В интербейсе не силен! Так и не понял, пробовали перекомпилировать хранимку и снова сделать бекап/рестор? И после рестора снова ошибка?
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616495
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anpl,

После перекомпиляции ошибка пропадает. После бэкапа/ресторе - нет. Напрягает, что ошибка регулярно возникает на инсталляционных базах
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616499
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пиши в саппорт
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616500
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

бэкап-рестор не "перекомпилирует" метаданные. Если процедура криво написана, значит ее надо исправить и перекомпилировать.

ошибка Multiple rows in singleton select - runtime, т.е. возникает когда запрос
select ... from ...
where ...
into :...
возвращает больше 1 записи. Так что ошибка может возникать, а может и пропадать в зависимости от данных.
http://www.ibase.ru/devinfo/sp_call.htm
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616501
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может где-то зависимость есть? Попробуй всё-всё перекомпилировать перед бекапом.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616512
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕсли процедура криво написана, значит ее надо исправить и перекомпилировать.Еще раз уточняю
_Vasilisk_Если процедуру перекомпилировать, ничего в ней не изменяя , ошибка пропадает.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616524
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Ошибка всегда проявляется на новой инсталляционной базе. Она всегда разворачивается из бэкапа.
_Vasilisk_Если процедуру перекомпилировать, ничего в ней не изменяя , ошибка пропадает.

Создай новую "инсталляционную базу", предварительно перекомпилировав в ней эту процедуру.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616529
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Еще раз уточняю
Заодно уточни когда эта ошибка начинает возникать. Если при восстановлении БД из
"инсталляционного" бэкапа, значит этот бэкап - битый, сделан с битой БД или с БД другой
версии (или даже системы).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616557
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Инсталляционный бэкап делается на IB 2009. Разворачивается на XE3. В оригинальной базе уже перекомпилировал эту процедуру. Ошибка вылезла опять
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616570
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если процедуру перекомпилировать, ничего в ней не изменяя, ошибка пропадает.
тогда я еще раз повторю, что blr, скомпилированный однажды, никакими манипуляциями кроме перекомпиляции объекта явным ALTER не перекомпилируется. И что указанная ошибка - runtime-ошибка, а не ошибка синтаксиса.
Может, у вас база со старых версий ИБ кочует по новым только через b/r?

Если проблема воспроизводится - да, значит есть баг, можете слать репорт. Но я бы сначала поискал проблему у себя. Заодно проверив версию IB XE3, поскольку их уже 4 апдейта вышло.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616573
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_бэкап делается на IB 2009. Разворачивается на XE3.
Значит нет у них совместимости. Вместо "инсталляционного бэкапа" сделай "инсталляционный
скрипт".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616575
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_В оригинальной базе уже перекомпилировал эту процедуру. Ошибка вылезла опять
лаконичность в данном случае не приветствуется. Вы хотите проблему решить? Описывайте подробно.
В оригинальной базе - это в какой? Под IB2009 или под ХЕ3?
"Ошибка вылезла опять" - это как? После перекомпиляции процедуры под ХЕ3?
Текст процедуры смотрели? Там точно нет запросов, которые могут вернуть 2 строки вместо одной?
я бы рекомендовал при возникновении ошибки по очереди взять подозрительные запросы из процедуры, и выполнить их в IBexpert, чтобы убедиться, что эти запросы возвращают 1, а не более записей.

Проверить-то элементарно.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616591
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

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

Вот код проблемной процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
CREATE PROCEDURE sp_sql_pln_rprt_sel (
  in_action_id INTEGER)
RETURNS (
  out_id INTEGER,
  out_sys_id INTEGER,
  out_pln_frq_id INTEGER,
  out_pln_sys_id INTEGER,
  out_pln_type_id INTEGER,
  out_pln_type_sys_id SMALLINT,
  out_rc_date DATE,
  out_rc_time TIME,
  out_rc_duration NUMERIC(18, 0),
  out_usr_id SMALLINT,
  out_usr_sys_id SMALLINT,
  out_usr_name VARCHAR(98),
  out_remark BLOB SUB_TYPE 1 SEGMENT SIZE 512)
AS
  DECLARE VARIABLE var_pln_id INTEGER;
  DECLARE VARIABLE var_old_pln_id INTEGER;
  DECLARE VARIABLE var_old_pln_sys_id SMALLINT;
  DECLARE VARIABLE var_last_control TIMESTAMP;
  DECLARE VARIABLE var_usr_status VARCHAR(6);
BEGIN
  out_usr_sys_id = 0;
  var_old_pln_id = -1;
  var_old_pln_sys_id = -1;
  FOR
    SELECT
      rep."PLN_FRQ_ID",
      rep."SYS_ID",
      rep."PLN_ID",
      pln."PLN_TYPE_ID",
      pln."PLN_TYPE_SYS_ID",
      rep."DURATION",
      rep."REMARK",
      rep."USR_ID"
    FROM
      plans pln
      LEFT JOIN plan_reports rep ON (
        (pln."ID" = rep."PLN_ID") AND
        (pln."SYS_ID" = rep."SYS_ID")
      )
    WHERE
      pln."STATUS" = 4 AND  /* psExported */
      pln."ACTION_ID" = :in_action_id
    ORDER BY
      pln."SYS_ID",
      pln."ID"
    INTO
      :out_pln_frq_id,
      :out_pln_sys_id,
      :var_pln_id,
      :out_pln_type_id,
      :out_pln_type_sys_id,
      :out_rc_duration,
      :out_remark,
      :out_usr_id
  DO BEGIN
    IF (
      (:var_old_pln_id <> :var_pln_id) AND
      (:var_old_pln_sys_id <> :out_pln_sys_id)
    ) THEN BEGIN
      var_old_pln_id = :var_pln_id;
      var_old_pln_sys_id = :out_pln_sys_id;
      SELECT
        COALESCE(MAX(ets."DATE_TIME"), CURRENT_TIMESTAMP)
      FROM
        tasks tsk
        LEFT JOIN exec_tasks ets ON (
          ets."TSK_ID" = tsk."ID" AND
          ets."TSK_SYS_ID" = tsk."SYS_ID" AND
          ets."STATUS" = 3
        )
      WHERE
        tsk."PLN_ID" = :var_pln_id AND
        tsk."PLN_SYS_ID" = :out_pln_sys_id
      INTO
        :var_last_control;
      out_rc_date = CAST(:var_last_control AS DATE);
      out_rc_time = CAST(:var_last_control AS TIME);
    END
    out_id = :out_pln_frq_id;
    out_sys_id = :out_pln_sys_id;
    EXECUTE PROCEDURE sp_i_usr_get_full_name(
      :out_usr_id
    ) RETURNING_VALUES(
      :var_usr_status,
      :out_usr_name
    );
    SUSPEND;
  END
END


Вот код процедуры sp_i_usr_get_full_name
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE PROCEDURE sp_i_usr_get_full_name (
  in_id SMALLINT)
RETURNS (
  out_status VARCHAR(6),
  out_name VARCHAR(98))
AS
  DECLARE VARIABLE var_first_name VARCHAR(33);
  DECLARE VARIABLE var_last_name VARCHAR(33);
  DECLARE VARIABLE var_second_name VARCHAR(32);
BEGIN
  SELECT
    usr."STATUS",
    COALESCE(usr."LAST_NAME" || ' ', ''),
    COALESCE(usr."FIRST_NAME" || ' ', ''),
    COALESCE(usr."SECOND_NAME", '')
  FROM
    users usr
  WHERE
    usr."ID" = :in_id
  INTO
    :out_status,
    :var_last_name,
    :var_first_name,
    :var_second_name;
  out_name = :var_last_name || :var_first_name || :var_second_name;
END

В таблице users поле ID - первичный ключ
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616596
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

а проблема разве не в
SELECT
COALESCE(MAX(ets."DATE_TIME"), CURRENT_TIMESTAMP)
...

_Vasilisk_В таблице users поле ID - первичный ключ
да пофиг что там первичный ключ. Допустим, индекс повредился - и полезли дубли в ПК.
Проверяйте, не доверяйте глазам.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616618
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvа проблема разве не в
SELECT
COALESCE(MAX(ets."DATE_TIME"), CURRENT_TIMESTAMP)Так ведь MAX()
kdvДопустим, индекс повредился - и полезли дубли в ПК.Рестор с валидацией (-va) проходит.
kdvПроверяйте, не доверяйте глазам.Глазами проверил :). Две записи ID 3 и 4.

Сейчас попробую базу кинуть. Порежу ненужные таблицы и кину
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616632
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Dimitry Sibiryakov,

Инсталляционный бэкап делается на IB 2009. Разворачивается на XE3. В оригинальной базе уже перекомпилировал эту процедуру. Ошибка вылезла опять

Вероятно в support, такое впечатление, что поменяли формат храниения скомпилированных процедур, в качестве теста попробовать в процедуре поменять
for select
на for select first 1
сделать b/r и посмотреть что получится.

Может быть связано и с этим Restoring database results in the error "unassigned code" :
Restoring database results in the error "unassigned code"

When restoring a database with InterBase XE, get the error unassigned code. With databases with a long lineage or databases backed up with InterBase 2009 and restored with InterBase XE, each case has different metadata security settings. So when selecting a system table (for example: RDB$RELATIONS) you get the error message: no permission for read/select access to table RDB$RELATIONS by user SYSDBA.

This error occurs with databases which have these criteria:
Originally created with a version of InterBase prior to InterBase 6.5.
Backed up with a version of InterBase prior to InterBase 2009.
Readmeta.sql has not been previously applied.

This behavior is exhibited due to stricter enforcement of meta data rights in InterBase XE during the restore of a database.

Solution:
To resolve this problem execute readmeta.sql against your database before you back it up. readmeta.sql may be found in \examples\security. You can execute readmeta.sql against your database using isql or IBConsole.

Explanation:
The problem occurs with databases that have a long lineage. The two cases are (1) a database has a restore history of IB6->IB7->IB2007->IB2009->IBXE; and (2) a database backed up and restored as IB2009->IBXE. Each case has different metadata security settings. The first instance never had metadata security because it originated from IB6. However with the second instance, it was created (not restored) by IB2009 with a full complement of security privileges for all system tables.

With the first case, the database was backed up and restored and with each succeeding release, the new release would install privileges for the new system tables in that release (think RDB$USERS, RDB$ENCRYPTIONS, RDB$ROLES, etc.). But it couldn't alter the original system tables because it had no way of knowing if the database owner had already altered their security privileges. For example, a user might have revoked all privileges to RDB$TRIGGERS and RDB$PROCEDURES to conceal their trigger and stored procedure code.

Also, in the first case, a SYSDBA may have run readmeta.sql years ago and refined the metadata from that baseline to a custom security profile. InterBase cannot override that customization by automatically resetting it after the XE restore. InterBase XE can't assume that every database it restores should unconditionally install the default metadata privileges because it doesn't know the history of individual databases.

So it is recommended to run readmeta.sql, which sets the default or starting point for configuring it the way you want it. This advice is independent of whether you are migrating to XE.

Example using isql:
isql "path to database"
-user sysdba -password masterkey -i readmeta.sql
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616637
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81Вероятно в support, такое впечатление, что поменяли формат храниения скомпилированных процедурИнтересное предположение. Проверю. Есть еще такой момент - я проблемную базу забєкапил на ХЕ3 и восстановил обратно на 2009. Ошибка осталась
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616665
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Какая-то хрень. Перенес базу на 2009. После перекомпиляции ошибка осталась. Стал рабираться. Проблема в запросе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
        COALESCE(MAX(ets."DATE_TIME"), CURRENT_TIMESTAMP)
      FROM
        tasks tsk
        LEFT JOIN exec_tasks ets ON (
          ets."TSK_ID" = tsk."ID" AND
          ets."TSK_SYS_ID" = tsk."SYS_ID" AND
          ets."STATUS" = 3
        )
      WHERE
        tsk."PLN_ID" = :var_pln_id AND
        tsk."PLN_SYS_ID" = :out_pln_sys_id
      INTO
        :var_last_control;


Он возвращает три записи с текущим временем. Если сделать такой запрос
Код: sql
1.
2.
3.
4.
SELECT
  ets."DATE_TIME"
FROM
  ....


возвращаются три записи. У каждой поле DATE_TIME заполненно
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616675
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Сейчас убрал COALESCE, поставил просто ручную проверку после запроса IF NULLL...
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616677
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ ets."STATUS" = 3
попутный вопрос - а зачем тут двойные кавычки? Не нужны они вообще.
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616687
shiliaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk__Vasilisk_,

Код: sql
1.
2.
3.
4.
SELECT
        COALESCE(MAX(ets."DATE_TIME"), CURRENT_TIMESTAMP)
      FROM
...



Привет.
А если

Код: sql
1.
2.
3.
4.
SELECT
        MAX(COALESCE(ets."DATE_TIME", CURRENT_TIMESTAMP))
      FROM
...



Сколько записей будет?
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616692
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_возвращаются три записи. У каждой поле DATE_TIME заполненноID одинаковые у записей?
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616699
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster_Vasilisk_возвращаются три записи. У каждой поле DATE_TIME заполненноID одинаковые у записей?

А какая разница?
MAX - не должен 3 записи возращать...
Но почему то кажется что база побитая получается, и там возможно не только это не работает...

p.s. На дурака, max там никак не переопределяли?
...
Рейтинг: 0 / 0
Multiple rows in singleton select
    #38616705
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81,

В общем опыты показали, что от конструкции COALESCE(MAX()) у IB 2009 сносит крышу. Симптомов я уже нашел три разных. По идее в ХЕ3 этот баг закрыли, поэтому при перекомпиляции все начинало работать.

Всем спасибо. Вопрос закрыт
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Multiple rows in singleton select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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