powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
7 сообщений из 7, страница 1 из 1
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581494
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

LI-V2.5.3.26744

Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> recreate table t(id int); commit;
SQL> insert into t values(1010);
SQL> insert into t values(1020);
SQL> insert into t values(1030);
SQL> insert into t values(1040);
SQL> commit;
В таблице, как видим, 4 записи.
Если теперь делать вот так:
Код: plaintext
1.
 -- var 1. 
select first 1 skip ( cast(rand()*4 as int) ) id, c from( select id,(select count(*) from t) c from t);
- то всё OK:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> select first 1 skip ( cast(rand()*4 as int) ) id, c from( select id,(select count(*) from t) c from t);

          ID            C
============ ============
        1030            4

SQL> select first 1 skip ( cast(rand()*4 as int) ) id, c from( select id,(select count(*) from t) c from t);

          ID            C
============ ============
        1040            4

SQL> select first 1 skip ( cast(rand()*4 as int) ) id, c from( select id,(select count(*) from t) c from t);

          ID            C
============ ============
        1020            4


А если вот эдак:
Код: plaintext
1.
 -- var 2. 
select first 1 skip ( cast(rand()*c as int) ) id, c from( select id,(select count(*) from t) c from t);
- то облом:
Statement failed, SQLSTATE = HY000
bad BLR -- invalid stream

А вот так если:
Код: plaintext
1.
 -- var 3. 
select first 1 skip ( cast(rand()*cast(c as int) as int) ) id, c from( select id,(select count(*) from t) c from t);
- то тоже швабра, но другая "слегка":
Код: plaintext
1.
2.
3.
4.
          ID            C
============ ============
Statement failed, SQLSTATE = 22000
no current record for fetch operation

Согласно доке :
Код: plaintext
1.
2.
3.
SELECT [FIRST (<int-expr>)] [SKIP (< int-exp r>)] <columns> FROM ...

<int-expr>  ::=  Any expression evaluating to an integer.
<columns>   ::=  The usual output column specifications.

Что тогда нарушают второй и третий варианты ?
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581498
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тонну текста не вчитывался, но видимо то, что параметр
first/skip не может зависеть от данных курсора, с которым
работает (что вполне очевидно). А то, что ты пытаешься
сделать - делается подзапросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581511
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

как можно обращаться к тому, что еще не прочитано из таблицы?
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581741
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не врубаюсь, чем принципиально отличаются вот эти два варианта:
var-1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> select id from( select id from t ) rows ((select count(*) from t));

Select Expression
    -> Singularity Check
        -> Aggregate
            -> Table "T" Full Scan
Select Expression
    -> First N Records
        -> Table "T" Full Scan

          ID
============
         416
         229
         955
          42
         230

== vs ==

var-2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select id from( select id,(select count(*) from t) c from t ) rows (c);

Select Expression
    -> Singularity Check
        -> Aggregate
            -> Table "T" Full Scan
Select Expression
    -> First N Records
        -> Materialize
            -> Table "T" Full Scan

          ID
============
Statement failed, SQLSTATE = 22000
no current record for fetch operation

Отличие в планах - только "Materialize".
Что он материализовал, просто выборку из `t` или же вот эту выборку: "select id,(select count(*) from t) c from t" - ?
Если второе, то значение столбца "c" должно быть известно во внешней части запроса (т.е. в "rows(c)").

Из-за чего лезет "no current record for fetch operation" ?
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581748
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

я выше уже написал, почему. FIRST/SKIP-параметры вычисляются до выборки из курсора, поэтому они не могут на него ссылаться.
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581754
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrя выше уже написал, почему. FIRST/SKIP-параметры вычисляются до выборки из курсора, поэтому они не могут на него ссылаться.Надо будет запомнить. Спасибо.

ЗЫ. Так что всё-таки он материализовал во втором варианте ?
...
Рейтинг: 0 / 0
select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
    #38581756
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

derived table, ибо у него в селект-листе есть подзапрос. Ты уже спрашивал про это раньше.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select first 1 skip ( <expr> ): "bad BLR -- invalid stream" или "no current record"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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