powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
25 сообщений из 73, страница 2 из 3
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408316
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxЧто-то я опять не пойму, чего от меня хочет компилятор.

Не,не, не...
Типа такого надо. Хотя, минимизировать надо, по-моему. Много лишнего на мой взгляд в переменных... И за тип не берусь - сам проверяй. Я принцип показываю.
Код: plaintext
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.
create or alter procedure GETDIFF (
    X_ integer,
    Y_ integer,
    R_ integer,
    DIFF_ integer,
    PERIOD_ integer,
    LEVEL_ integer)
as
declare variable MIN_ integer;
declare variable MAX_ integer;
declare variable X integer;
declare variable Y integer;
declare variable Rasst integer;
declare variable Fullname varchar( 100 );
declare variable sectorNmame varchar( 100 );
declare variable LVL integer;
begin
    for SELECT s.id,
        s.x,
        s.y,
        ROUND(SQRT(ABS(:x_-s.x)*ABS(:x_-s.x) + ABS(:y_-s.y)*ABS(:y_-s.y)), 2 ) as Rasst,
        s.fullName,
        s.sectorName,
        s."LEVEL",
        (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MIN,
        (select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MAX
    FROM experience AS e, sector as s
    WHERE s.id=e.id AND s.x >= :x_-:r_ AND s.x <= _x+_r AND s.y >= :y_-:r_ AND s.y >= :y_+:r_
    AND ((select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp))-
        (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)))<:diff_
    AND s."LEVEL" >=  15  AND  s."LEVEL" <= :level_
    GROUP BY e.id
    ORDER BY s."LEVEL", Rasst into :X, :Y, :Rasst, :FullName, :sectorName, :min_, :max_, :LVL;
do
begin
    DIFF = max_ - min_ ;
    suspend;
end
end
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408321
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxЧто-то я опять не пойму, чего от меня хочет компилятор.
Код: plaintext
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.
create or alter procedure GETDIFF (
    X_ integer,
    Y_ integer,
    R_ integer,
    DIFF_ integer,
    PERIOD_ integer,
    LEVEL_ integer)
as
declare variable MIN_ integer;
declare variable MAX_ integer;
begin
    SELECT s.id,
        s.x,
        s.y,
        ROUND(SQRT(ABS(:x_-s.x)*ABS(:x_-s.x) + ABS(:y_-s.y)*ABS(:y_-s.y)), 2 ) as Rasst,
        s.fullName,
        s.sectorName,
        s."LEVEL",
        (select MIN(e1.experience) into :min_ from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MIN,
        (select MAX(e2.experience) into :max_ from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MAX,
        :max_-:min_ as DIFF
    FROM experience AS e, sector as s
    WHERE s.id=e.id AND s.x >= :x_-:r_ AND s.x <= _x+_r AND s.y >= :y_-:r_ AND s.y >= :y_+:r_
    AND ((select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp))-
        (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)))<:diff_
    AND s."LEVEL" >=  15  AND  s."LEVEL" <= :level_
    GROUP BY e.id
    ORDER BY s."LEVEL", Rasst;
    suspend;
end
Ругается на "into :min_". Указывает на into.
Код: plaintext
1.
2.
3.
4.
Invalid token.
Dynamic SQL Error.
SQL error code = - 104 .
Token unknown - line  19 , column  36 .
into.




Так краем глаза

Убери
into :min_
into :max_
:max_-:min_ as DIFF

впрочем заодно и
as Rasst
as MIN
as MAX

Замени
ORDER BY s."LEVEL", Rasst;
на
ORDER BY 7,4

и добавь
into
в сам основной select
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408322
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, там с логикой запроса засада, на логику не смотреть, я тупо скопипастил и обрамил!
Я принцип я хотел показать - результат запроса идет в переменные, в into. И только потом над ними выполнять действия всякие.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408376
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxЧто-то я опять не пойму, чего от меня хочет компиляторRTFM'а он от тебя хочет
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408478
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осталась последняя хранимая процедура.
Остальные 4 были достаточно однотипными и похожими на то, что указано в старте топика.
У меня что-то даже идей нету, как переделать этот код.
Буду читать маны, может найду что-то похожее. :)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408557
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О, тут уже на вторую страницу насобиралось постов, а я только сейчас увидел.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408698
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал как-то через пень-колоду... :)

Код: plaintext
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.
create or alter procedure GETDIFF (
    X_ integer,
    Y_ integer,
    R_ integer,
    DIFF_ integer,
    PERIOD_ integer,
    LEVEL_ integer)
returns (
    OUT_ID_ integer,
    OUT_X_ integer,
    OUT_Y_ integer,
    OUT_RASST_ integer,
    OUT_FN_ integer,
    OUT_SN_ integer,
    OUT_LVL_ integer,
    OUT_MIN_ integer,
    OUT_MAX_ integer,
    OUT_DIFF_ integer)
as
declare variable MIN_ integer;
declare variable MAX_ integer;
begin
    SELECT s.id,
        s.x,
        s.y,
        ROUND(SQRT(ABS(:x_-s.x)*ABS(:x_-s.x) + ABS(:y_-s.y)*ABS(:y_-s.y)), 2 ) as Rasst,
        s.fullName,
        s.sectorName,
        s."LEVEL",
        (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as "MIN",
        (select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as "MAX",
        ((select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp))-
        (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp))) as DIFF
    FROM experience AS e, sector as s
    WHERE s.id=e.id AND s.x >= :x_-:r_ AND s.x <= :x_+:r_ AND s.y >= :y_-:r_ AND s.y >= :y_+:r_
    AND ((select MAX(e2.experience) from experience as e2  where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp))-
        (select MIN(e1.experience) from experience as e1  where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)))<:diff_
    AND s."LEVEL" >=  15  AND  s."LEVEL" <= :level_
    GROUP BY e.id
    ORDER BY  7 ,  4 
    INTO :out_id_, :out_x_, :out_y_, :out_rasst_, :out_fn_, :out_sn_, :out_lvl_, :out_min_, :out_max_, :out_diff_;
    suspend;
end
Выводит ошибку после компиляции:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408707
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал
Код: plaintext
1.
GROUP BY s.id, s.x, s.y, s.fullName, s.sectorName, s."LEVEL", "MIN", "MAX", DIFF

Пробовал
Код: plaintext
1.
GROUP BY s.id, s.x, s.y, Rasst, s.fullName, s.sectorName, s."LEVEL"

Не помогает.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408712
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

Так не удивительно ведь агрегирующей функции нет
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408716
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, без GROUP BY откомпилировалось, спасибо.
Только теперь интересно, как оно будет реагировать на несколько записей в таблице experience с одинаковым id и разным таймштампом.
Надо наверное DISTINCT добавить.
Проверю, как вернусь домой.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408721
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxСделал как-то через пень-колоду...Вот что mysql делает с людьми
denixx, послушай добрый совет - научись писать запросы, ну почитай уже учебник по SQL, что ли...
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408729
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так это у меня наверное в мускуле не совсем правильно написано :-[
Но работало.
Хотя может там как-то по хитрому работало.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408733
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Да читаю потихоньку, читаю.
Просто это было написано до прочтения книги, и работало )
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408743
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Желательно использовать явный JOIN
2. Инструкция HAVING спасёт отца русской демократии
3. С использованием таблицы experience явный перебор по мне так достаточно один раз связать
4. Твоя процедура всегда будет возвращать одну запись? Если нет то нужен FOR SELECT

Что-то типа этого

Код: plaintext
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.
   FOR SELECT 
        s.id,
        s.x,
        s.y,
        ROUND(SQRT(ABS(:x_-s.x)*ABS(:x_-s.x) + ABS(:y_-s.y)*ABS(:y_-s.y)), 2 ) as Rasst,
        s.fullName,
        s.sectorName,
        s."LEVEL",
        MIN(e.experience) AS MIN,
        MAX(e.experience) AS MAX,
        (MAX(e.experience) - MIN(e.experience)) AS DIFF
    FROM experience e 
            INNER JOIN sector s ON e.id = s.id
    WHERE (s.x >= :x_-:r_)  AND 
              (s.x <= :x_+:r_) AND 
              (s.y >= :y_-:r_) AND 
              (s.y >= :y_+:r_) AND
              (s."LEVEL" >=  15 ) AND
              (s."LEVEL" <= :level_) AND
              (e."TIME">DATEADD(DAY, -(:period_), current_timestamp)
    GROUP BY  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 
    HAVING MAX(e.experience) - MIN(e.experience) < : diff_
    ORDER BY  7 ,  4 
    INTO :out_id_, :out_x_, :out_y_, :out_rasst_, :out_fn_, :out_sn_, :out_lvl_, :out_min_, :out_max_, :out_diff_
DO
    suspend;
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408826
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

До JOIN'ов я ещё не дошел...
Спасибо, а то потом бы ещё долго думал, почему же у меня выводится только одна запись, а оказывается надо в FOR заключать SELECT.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408836
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис1. Желательно использовать явный JOIN


Хотя вроде в книге "SQL для чайников" написано, что INNER JOIN и обычное перечисление таблиц в FROM дают одинаковый результат.
Они врут? :)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408846
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторХотя вроде в книге "SQL для чайников" написано, что INNER JOIN и обычное перечисление таблиц в FROM дают одинаковый результат.
Они врут? :)

Нет не врут, но только при условии, если в секции WHERE есть связь между этими таблицами.
Писать можно и так и так, но всё же я предпочитаю использовать явный JOIN, чтобы отделить условие связи таблиц от остальных условий
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408856
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Код: plaintext
1.
2.
(s.y >= :y_-:r_) AND 
(s.y >= :y_+:r_)

И ошибку сразу видно.
Должно было быть в оригинале
(s.y <= :y_+:r_)
Хорошая конструкция :)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408862
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
create or alter procedure GETDIFF (
    X_ integer,
    Y_ integer,
    R_ integer,
    DIFF_ integer,
    PERIOD_ integer,
    LEVEL_ integer)
returns (
    OUT_ID_ integer,
    OUT_X_ integer,
    OUT_Y_ integer,
    OUT_RASST_ integer,
    OUT_FN_ integer,
    OUT_SN_ integer,
    OUT_LVL_ integer,
    OUT_MIN_ integer,
    OUT_MAX_ integer,
    OUT_DIFF_ integer)
as
declare variable MIN_ integer;
declare variable MAX_ integer;
begin
    FOR SELECT 
            s.id,
            s.x,
            s.y,
            ROUND(SQRT(ABS(:x_-s.x)*ABS(:x_-s.x) + ABS(:y_-s.y)*ABS(:y_-s.y)), 2 ) as Rasst,
            s.fullName,
            s.sectorName,
            s."LEVEL",
            MIN(e.experience) AS "MIN",
            MAX(e.experience) AS "MAX",
            (MAX(e.experience) - MIN(e.experience)) AS DIFF
        FROM experience e 
                INNER JOIN sector s ON e.id = s.id
        WHERE (s.x >= :x_-:r_) AND
              (s.x <= :x_+:r_) AND
              (s.y >= :y_-:r_) AND
              (s.y <= :y_+:r_) AND
              (s."LEVEL" >=  15 ) AND
              (s."LEVEL" <= :level_) AND
              (e."TIME">DATEADD(DAY, -(:period_), current_timestamp)
        GROUP BY  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 
        HAVING MAX(e.experience) - MIN(e.experience) < :diff_
        ORDER BY  7 ,  4 
        INTO :out_id_, :out_x_, :out_y_, :out_rasst_, :out_fn_, :out_sn_, :out_lvl_, :out_min_, :out_max_, :out_diff_
    DO
    suspend;
end

Выдаёт ошибку
Код: plaintext
1.
2.
3.
4.
5.
Invalid token.
Dynamic SQL Error.
SQL error code = - 104 .
Token unknown - line  43 , column  9 .
GROUP.
Теперь-то мы чем ему не угодили?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408864
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxТеперь-то мы чем ему не угодили?
Скобки считай, двоечник.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408869
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx> Теперь-то мы чем ему не угодили?

Скобками.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408882
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ааа. А я уж думал опять какая-то дикая заковырка.
И правда, одной скобки не хватало.

Dimitry Sibiryakov,
Злой ты :) Сразу "двоечник".
Я учусь! :)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408887
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На двойки и учишься. Нет чтобы книжки почитать, на пятерки учиться... :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408905
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учусь не в универе, учусь как раз с книжками. Универ, слава богу, в этом году закончил.
Просто переучиваться думать из одной СУБД в другую с различающимся синтаксисом, да ещё и не зная толком начал SQL - бяда, бяда )
Мускул-то ещё хоть с натяжкой похож на Sybase, я не говорю, что совсем похож, но процедуры вроде пишутся без проблем. Друг работает с Sybase, его хоть можно спросить, если что-то идёт не так. А с ФБ и спрашивать, кроме вас, некого.
Читал Мартина Грабера, "Понимание SQL", с этим ужасным переводом... Остановился где-то на середине. Если устроюсь работать, куда хочу, куплю бумажную версию, думаю с переводом будет получше.

Ну вроде база данных готова, осталось только теперь модифицировать Java-код.
А до этого написать приложеньице, которое сможет из одной БД в другую перелить все данные, которые уже наработаны. Можно конечно этого и не делать... но всё же так будет интереснее.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408908
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А с мускулом, кстати, так же шишки набивал.
Но там Workbench на лету показывает ошибки синтаксиса, а тут только на этапе компиляции, поэтому и не заметил скобку.
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 2 из 3
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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