Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
всем привет
не получатся выполнить этот код в ibexpert(2020.7.16.2)
ругается на поле select rec = count(*) from t2;

суть такая что нужно внести рандомные значения в поле NUM таблицы t2, в диапазоне max min полей NUM из таблицы t1
какбы логику сделал, а реализовать не получается

EXECUTE BLOCK 
AS

DECLARE c int;
DECLARE rec int;

select rec = count(*) from t2;
SET c = 1;

WHILE c <= rec;
BEGIN

UPDATE t2 SET  "NUM" = (SELECT CAST(TRUNC(RAND() *
	     (select MAX("NUM") from t1) + 
             (select MIN("NUM") from t1) FROM RDB$DATABASE) WHERE ID = c;


SET c = c + 1;
END


Сообщение было отредактировано: 16 июл 20, 20:45
16 июл 20, 20:48    [22168859]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31305
parallax113

ругается на поле select rec = count(*) from t2;

это ты чего сделать хотел?
16 июл 20, 20:55    [22168862]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
Мимопроходящий
parallax113

ругается на поле select rec = count(*) from t2;

это ты чего сделать хотел?


в переменную rec поместить количество строк таблицы t2

кстати извиняюсь, ошибся в update запросе :
UPDATE t2 SET  "NUM" = (SELECT CAST(TRUNC(RAND() *
	     (select MAX("NUM") from t1) + 
             (select MIN("NUM") from t1)) as INTEGER) FROM RDB$DATABASE) WHERE ID = c;

забыл к CAST добавить as INTEGER

но вопрос ещё актуален

Сообщение было отредактировано: 16 июл 20, 21:03
16 июл 20, 20:57    [22168863]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1400
parallax113

в переменную rec поместить количество строк таблицы t2

здесь вам не там
select count(*) from t2 into :rec;

ну или если уж совсем хочется через присвоение
rec=(select count(*) from t2);
16 июл 20, 21:15    [22168866]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
m7m
parallax113

в переменную rec поместить количество строк таблицы t2

здесь вам не там
select count(*) from t2 into :rec;

ну или если уж совсем хочется через присвоение
rec=(select count(*) from t2);


Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 7, column 1.
SELECT.

во всех вариантах
16 июл 20, 21:20    [22168869]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
hvlad
Member

Откуда:
Сообщений: 10993
parallax113,

синтаксис подучи. С процедурами полностью совпадает (кроме заголовка).
16 июл 20, 21:21    [22168871]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8597
Если сам тест на профпригодность не прошел, то ответ под спойлером.
+
Нет банального begin после секции деклараций и соотв. end в конце.
17 июл 20, 07:54    [22168990]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
короче ладно всем спасибо

запрос работает рекурсивно, без вайл-лупов и лишней логики, вот так:
UPDATE t2 SET  "NUM" = (SELECT CAST(TRUNC(RAND() *
	     (select MAX("NUM") from t1) + 
             (select MIN("NUM") from t1)) as INTEGER) FROM RDB$DATABASE);


собственно так и быстрее будет

Сообщение было отредактировано: 18 июл 20, 08:19
18 июл 20, 08:21    [22169613]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
AltHasp
Member

Откуда:
Сообщений: 162
parallax113,

Для чего двойные кавычки используете ?
18 июл 20, 11:03    [22169651]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
Vlad F
Member

Откуда:
Сообщений: 1319
parallax113,

Тогда бы еще и вынес предварительные вычисления MAX() и MIN() из собственно апдейта.

Сообщение было отредактировано: 18 июл 20, 11:35
18 июл 20, 11:38    [22169660]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
AltHasp
parallax113,

Для чего двойные кавычки используете ?

артефакт =)

Сообщение было отредактировано: 18 июл 20, 12:30
18 июл 20, 12:28    [22169679]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
AltHasp
parallax113,

Для чего двойные кавычки используете ?


артефакт =)
18 июл 20, 12:32    [22169681]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
parallax113
Member

Откуда:
Сообщений: 17
Vlad F
parallax113,

Тогда бы еще и вынес предварительные вычисления MAX() и MIN() из собственно апдейта.

кстати да
18 июл 20, 12:33    [22169682]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE BLOCK в ibexpert  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29015
parallax113
артефакт =)

глаза не лопнут? лучше от этого избавиться.
19 июл 20, 01:02    [22169870]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить