powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
73 сообщений из 73, показаны все 3 страниц
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37405418
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перевожу учебный проект с MySQL на Firebird Embedded. Готовлю базу данных для эксплуатации.
Это вроде последнее, что останавливает от перехода на Firebird.

Есть таблица "sector", в неё посредством хранимой процедуры вставляется или изменяется запись.

Итак, хранимая процедура в MySQL, как она есть:
Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
CREATE DEFINER=`root`@`localhost` PROCEDURE `addOrChangeRecord`( 
    v BIGINT, 
    _id BIGINT, 
    segmentId INT, 
    socialId VARCHAR( 25 ), 
    fullName VARCHAR( 50 ), 
    photoUrl TINYTEXT, 
    registrationTime DATETIME, 
    _level INT, 
    sectorName VARCHAR( 50 ), 
    x INT, 
    y INT, 
    caravanSpeed DOUBLE, 
    occupantUserId BIGINT, 
    sectorSkinTypeId BIGINT) 
BEGIN 
IF EXISTS (select  1  from `WarRules`.`sector` where id = _id) 
THEN UPDATE `WarRules`.`sector` SET 
    `v` = v, 
    `id` = _id, 
    `segmentId` = segmentId, 
    `socialId` = socialId, 
    `fullName` = fullName, 
    `photoUrl` = photoUrl, 
    `registrationTime` = registrationTime, 
    `level` = _level, 
    `sectorName` = sectorName, 
    `x` = x, 
    `y` = y, 
    `caravanSpeed` = caravanSpeed, 
    `occupantUserId` = occupantUserId, 
    `sectorSkinTypeId` = sectorSkinTypeId 
WHERE id=_id; 
select CONCAT('ID: ', _id , ' FullName: ', fullName , ' Запись обновлена.'); 
ELSE INSERT INTO `WarRules`.`sector` ( 
        `v`, 
        `id`, 
        `segmentId`, 
        `socialId`, 
        `fullName`, 
        `photoUrl`, 
        `registrationTime`, 
        `level`, 
        `sectorName`, 
        `x`, 
        `y`, 
        `caravanSpeed`, 
        `occupantUserId`, 
        `sectorSkinTypeId` 
    ) VALUES ( 
        v, 
        _id, 
        segmentId, 
        socialId, 
        fullName, 
        photoUrl, 
        registrationTime, 
        _level, 
        sectorName, 
        x, 
        y, 
        caravanSpeed, 
        occupantUserId, 
        sectorSkinTypeId 
    ); 
select CONCAT('ID: ', _id , ' FullName: ', fullName , ' Запись добавлена.'); 
END IF; 
END

Теперь то, что я наваял в IBExpert:
Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
create or alter procedure ADDORCHANGERECORD (
    "_V" bigint,
    "_ID" bigint,
    "_SEGMENTID" integer,
    "_SOCIALID" varchar( 25 ),
    "_FULLNAME" varchar( 50 ),
    "_PHOTOURL" blob sub_type  1  segment size  255 ,
    "_REGISTRATIONTIME" timestamp,
    "_LEVEL" integer,
    "_SECTORNAME" varchar( 50 ),
    "_X" integer,
    "_Y" integer,
    "_CARAVANSPEED" double precision,
    "_OCCUPANTUSERID" bigint,
    "_SECTORSKINTYPEID" bigint)
as
begin
if (EXISTS(select  1  from sector where id = "_ID"))
THEN
BEGIN
UPDATE sector SET
    v = "_V",
    id = "_ID",
    segmentId = "_SEGMENTID",
    socialId = "_SOCIALID",
    fullName = "_FULLNAME",
    photoUrl = "_PHOTOURL",
    registrationTime = "_REGISTRATIONTIME",
    level = "_LEVEL",
    sectorName = "_SECTORNAME",
    x = "_X",
    y = "_Y",
    caravanSpeed = "_CARAVANSPEED",
    occupantUserId = "_OCCUPANTUSERID",
    sectorSkinTypeId = "_SECTORSKINTYPEID"
WHERE id="_ID";
select CONCAT('ID: ', "_ID" , ' FullName: ', "_FULLNAME" , ' Запись обновлена.');
END
ELSE
BEGIN
INSERT INTO sector (
        v,
        id,
        segmentId,
        socialId,
        fullName,
        photoUrl,
        registrationTime,
        level,
        sectorName,
        x,
        y,
        caravanSpeed,
        occupantUserId,
        sectorSkinTypeId
    ) VALUES (
        "_V",
        "_ID",
        "_SEGMENTID",
        "_SOCIALID",
        "_FULLNAME",
        "_PHOTOURL",
        "_REGISTRATIONTIME",
        "_LEVEL",
        "_SECTORNAME",
        "_X",
        "_Y",
        "_CARAVANSPEED",
        "_OCCUPANTUSERID",
        "_SECTORSKINTYPEID"
    );
select CONCAT('ID: ', "_ID" , ' FullName: ', "_FULLNAME" , ' Запись добавлена.');
END
end

Если возле ' Запись обновлена.'); оставить символ ";", то IBExpert указывает на окончание этой строки. Если точку с запятой убрать, то указывает на следующий END.
Не пойму, что он от меня тут хочет. Дальше я пока не правил сильно.
Правильно ли я использую переменные, передаваемые в хранимую процедуру? Просто "_ID", с кавычками?
Правильно ли я делаю CONCAT?

Помогите плз, а то хелпы на ibexpert.net не очень радуют наличием нужной информации.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37405433
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И то, что я вместо DATETIME поставил timestamp, это правильно?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37405446
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. как писать процедуры:
http://www.ibase.ru/devinfo/sp_call.htm
читай про "Обработка данных в процедурах"

потому что вот это
select CONCAT('ID: ', _id , ' FullName: ', fullName , ' Запись обновлена.');
во-первых фигня, т.к. Select без from в IB/FB нет. Во-вторых, у тебя в процедуре данные никуда не возвращаются. И в третьих, в IB/FB нет CONCAT, можно просто писать result=cast(id as varchar(15))||FullName||' Запись обновлена'

2. двойных кавычек нафигачил зря.
http://www.ibase.ru/ibfaq.htm#dtproblem

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or alter procedure ADDORCHANGERECORD (
    V_ bigint,
    ID_ bigint,
    SEGMENTID_ integer,
...
UPDATE sector SET
    v = :V_,
    id = :ID_,
    segmentId = :SEGMENTID_,
...

в таблицах, к счастью, этого ужаса ("имя"), как я вижу, нет. Впрочем, можно оставить и так, если тебя не напрягает закавычивание таких имен переменных. Без двойных кавычек идентификатор должен начинаться с латинской буквы.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406430
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.
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.
create or alter procedure ADDORCHANGERECORD (
    V_ bigint,
    ID_ bigint,
    SEGMENTID_ integer,
    SOCIALID_ varchar( 25 ),
    FULLNAME_ varchar( 50 ),
    PHOTOURL_ varchar( 255 ),
    REGISTRATIONTIME_ timestamp,
    LEVEL_ integer,
    SECTORNAME_ varchar( 50 ),
    X_ integer,
    Y_ integer,
    CARAVANSPEED_ double precision,
    OCCUPANTUSERID_ bigint,
    SECTORSKINTYPEID_ bigint)
returns (
    OUT varchar( 255 ))
as
begin
if (EXISTS(select  1  from sector where id = :ID_))
THEN
BEGIN
UPDATE sector SET
    v = :V_,
    id = :ID_,
    segmentId = :SEGMENTID_,
    socialId = :SOCIALID_,
    fullName = :FULLNAME_,
    photoUrl = :PHOTOURL_,
    registrationTime = :REGISTRATIONTIME_,
    level = :LEVEL_,
    sectorName = :SECTORNAME_,
    x = :X_,
    y = :Y_,
    caravanSpeed = :CARAVANSPEED_,
    occupantUserId = :OCCUPANTUSERID_,
    sectorSkinTypeId = :SECTORSKINTYPEID_
WHERE id=:ID_;
OUT = ('ID: '||cast(:id_ as varchar( 15 ))||' FullName: '||:FullName_||' Запись обновлена');
suspend;
END
ELSE
BEGIN
INSERT INTO sector (
        v,
        id,
        segmentId,
        socialId,
        fullName,
        photoUrl,
        registrationTime,
        level,
        sectorName,
        x,
        y,
        caravanSpeed,
        occupantUserId,
        sectorSkinTypeId
    ) VALUES (
        :V_,
        :ID_,
        :SEGMENTID_,
        :SOCIALID_,
        :FULLNAME_,
        :PHOTOURL_,
        :REGISTRATIONTIME_,
        :LEVEL_,
        :SECTORNAME_,
        :X_,
        :Y_,
        :CARAVANSPEED_,
        :OCCUPANTUSERID_,
        :SECTORSKINTYPEID_
    );
OUT = ('ID: '||cast(:id_ as varchar( 15 ))||' FullName: '||:FullName_||' Запись добавлена');
suspend;
END
end

При выполнении выводит следующее:
EXECUTE PROCEDURE addorchangerecord(25790, 1, 1, 'One', 'Два', 'Three', '2011-02-16 12:02:09', 51, 'Четыре', 1, 6, 10.4, NULL, 1050);

1 record(s) was(were) updated in SECTOR
------ Результаты выполнения процедуры: ------
OUT = ID: 1 FullName: Два Запись обновлена
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406459
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxOUT = ID: 1 FullName: Два Запись обновлена

А вот нахрена эти понты? Косплеишь Капитана Очевидность?..

И зачем вообще процедура там, где хватит одного запроса UPDATE OR INSERT?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406460
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плохо прочитал. для не-селективных процедур (вызываемых по execute) suspend не нужен.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406515
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovdenixxOUT = ID: 1 FullName: Два Запись обновлена

А вот нахрена эти понты? Косплеишь Капитана Очевидность?..

Да, косплею КО )
Это потом используется для формирования лога, что происходит вообще в приложении.
Я только изучаю Java и таково было решение при использовании MySQL.

Dimitry SibiryakovИ зачем вообще процедура там, где хватит одного запроса UPDATE OR INSERT?..

Опять же, таково было решение для MySQL, решил сделать по образу и подобию, чтобы не сильно курочить уже готовый код в Java.
Это не единственная процедура в БД, она выбрана, как наиболее простая, чтобы разобраться с логикой запуска.

kdvплохо прочитал. для не-селективных процедур (вызываемых по execute) suspend не нужен.

Убрал, спасибо.

-=-=-

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

А что, для того, чтобы записать строчку в лог, обязательно надо её получить с сервера?
Прямо в тексте программы её написать Жаба не позволяет?..

denixxрешил сделать по образу и подобию, чтобы не сильно курочить уже готовый код в
Java.
Тебе всё равно придётся менять строчку вызова мускульной процедуры, так какая разница -
написать вместо неё "EXECUTE PROCEDURE" или "UPDATE OR INSERT"?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406542
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxПока-что выбивает ошибку.
здесь подобные выражения, без указания точного сообщения об ошибке, дают повод заподозрить низкий IQ.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406609
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Я просто тогда ещё даже не загуглил ошибку :) Надо же было самому разобраться.
Нашел тут , что Malformed string = проблемы с кодировкой. Оказалось, что это у меня в Eclipse стоит в настройках сохранение всех файлов проекта в win1251, а надо UTF8. Поменял, перекодировал файл, и "русские" строки теперь прокатывают.

Дальше - больше.

Exception in thread "main" org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -504
Invalid cursor reference
Cursor is not open

Код программы:
Код: 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.
 package  test;

 import  java.sql.*;

 public   class  Main {

	 public   static   void  main(String[] args)  throws  Exception {
		 Class .forName("org.firebirdsql.jdbc.FBDriver");

		PreparedStatement prstmt =  null ;
		Connection cn = DriverManager.getConnection(
				"jdbc:firebirdsql:embedded:WARRULES.FDB",
				"SYSDBA", "masterkey");
                prstmt = cn.prepareStatement("EXECUTE PROCEDURE addOrChangeRecord"+
        		"(?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
		prstmt.setLong( 1 , 25790L);
		prstmt.setLong( 2 , 1L);
		prstmt.setInt( 3 ,  1 );
		prstmt.setString( 4 , "One");
		prstmt.setString( 5 , "Два");
		prstmt.setString( 6 , "Three");
		prstmt.setString( 7 , "2011-02-16 12:02:09");
		prstmt.setInt( 8 ,  51 );
		prstmt.setString( 9 , "Четыре");
		prstmt.setInt( 10 ,  1 );
		prstmt.setInt( 11 ,  6 );
		prstmt.setDouble( 12 ,  10 .4D);
		prstmt.setNull( 13 , java.sql.Types.BIGINT);
		prstmt.setLong( 14 , 1050L);
		prstmt.execute();
		ResultSet rs = prstmt.getResultSet();
		 while (rs.next()){
			System.out.println(rs.getString( 1 ));
		}
	}
}

Ожидаемое поведение программы:
Выполняет запрос, выводит строчку "ID: 1 FullName: Два Запись обновлена" в консоль...

Что-то нашел по этому эксепшену здесь , но пока не пойму, что мне делать.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxprstmt.getResultSet();

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

О. Даже так...
А как же тогда вернуть из переменной текст?
Я с такой задачей ещё не сталкивался.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406644
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxА как же тогда вернуть из переменной текст?
То, что у неё на выходе не ResultSet, а скалярный вектор, тебя сбивает с толку? Почитай
справку по JDBC.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406645
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxА как же тогда вернуть из переменной текст?Либо через Select from Proc, либо через выходные параметры после вызова Exec Proc.
И прочитай, наконец, статью, ссылку на которую тебе уже дали.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406699
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.ibase.ru/devinfo/sp_call.htm
Код: plaintext
1.
2.
3.
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('EXECUTE PROCEDURE TEST');  
IBSQL1.ExecQuery;
ShowMessage(IBSQL1.Current[ 0 ].asString);

Это, походу, Delphi?

Как такое сделать на Java?
Должно быть всё просто... Но что-то пока не доходит :(
Не знаю, какой метод использовать в Java.
В методах prstmt ничего полезного не вижу.
Сам prstmt.execute(); возвращает boolean. Мне от него ни холодно, ни жарко.

Подскажите плз, а то что-то не помогает мне гугл...
А только наоборот, куда-то уводит в дебри.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406701
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустамчерез выходные параметры после вызова Exec Proc.
Интересует этот вариант.
Такого я ещё не делал вообще.

Гаджимурадов РустамИ прочитай, наконец, статью, ссылку на которую тебе уже дали.
Статью почитал, там примеры для Delphi, как я понял.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406702
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxКак такое сделать на Java?
Должно быть всё просто... Но что-то пока не доходит :(
Не знаю, какой метод использовать в Java.
В методах prstmt ничего полезного не вижу.Java тут никто не знает! (с)

Задай вопрос в профильном форуме - помогут.
Ищи что-то вроде prstmt.Get_Нужный_Тип
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406703
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37406897
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл, наконец!
В мануале к JayBird на странице 47 была описана такая вещь, как CallableStatement:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CallableStatement cst =  null ;
Connection cn = DriverManager.getConnection(
		"jdbc:firebirdsql:embedded:WARRULES.FDB",
		"SYSDBA", "masterkey");
cst = cn.prepareCall("EXECUTE PROCEDURE addOrChangeRecord"+
	"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
cst.setLong( 1 , 25790L);
cst.setLong( 2 , 1L);
cst.setInt( 3 ,  1 );
cst.setString( 4 , "One");
cst.setString( 5 , "Два");
cst.setString( 6 , "Three");
cst.setString( 7 , "2011-02-16 12:02:09");
cst.setInt( 8 ,  51 );
cst.setString( 9 , "Четыре");
cst.setInt( 10 ,  1 );
cst.setInt( 11 ,  6 );
cst.setDouble( 12 ,  10 .4D);
cst.setNull( 13 , java.sql.Types.BIGINT);
cst.setLong( 14 , 1050L);
cst.registerOutParameter( 15 , java.sql.Types.VARCHAR);
cst.execute();
System.out.println(cst.getString( 15 ));

Добавился ещё один вопрос в тексте запроса (15й), в этом месте и регистрируется выдаваемая переменная.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37407205
Микросекунда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov пишет:

DS> скалярный вектор

Можно, я это запишу ? :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37407983
AndreyUB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

А если поискать по форуму Java, то можно найти готовый пример по работе с хранимыми процедурами,
я когда то выкладывал. А так удачи, это только азы азов в Java.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408172
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreyUBудачи
Спасибо.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408240
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.

Было через знак =
Код: plaintext
1.
2.
3.
min_ = (select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MIN,
max_ = (select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp)) as MAX,
:max_-:min_ as DIFF
Ругается на знак =.

Пробовал ещё into в конец ставить, как на ibase написано:
Код: plaintext
1.
2.
3.
(select MIN(e1.experience) from experience as e1 where e1.id=e.id AND e1."TIME">DATEADD(DAY, -(:period_), current_timestamp) into :min_) as MIN,
(select MAX(e2.experience) from experience as e2 where e2.id=e.id AND e2."TIME">DATEADD(DAY, -(:period_), current_timestamp) into :max_) as MAX,
:max_-:min_ as DIFF
Тоже ругается на into.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408275
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так писать нельзя.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408302
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

А в мускуле можно.
Как же тогда выйти из ситуации?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в 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
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408917
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используй IBExpert.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408922
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx> Учусь не в универе, учусь как раз с книжками.
denixx> Универ, слава богу, в этом году закончил.

Какая разница где, главное результат. :)

denixx> Читал Мартина Грабера, "Понимание SQL", с этим ужасным переводом...
denixx> Если устроюсь работать, куда хочу, куплю бумажную версию

Купи (или скачай, если денег нет) книги "Мир Interbase"
и "Firebird. Руководство разработчика баз данных".

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37408928
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxА с ФБ и спрашивать, кроме вас, некого.
Как это "некого"? А Language Reference?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409505
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

Код: plaintext
Просто переучиваться думать из одной СУБД в другую с различающимся синтаксисом, да ещё и не зная толком начал SQL - бяда, бяда

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

Ну да, я это имел ввиду.

Симонов Денисdenixx,
Я думая, что у тебя и в MySQL эти запросы криво работали
Остальные были однотипные: "вставить или обновить запись, в качестве вывода показать, что произошло".
Последний - вполне возможно.
Но вроде данные выбирал "правильно", на первый взгляд.
HAVING, конечно, сильно упростил задачу.
Проверил только что, вроде эта конструкция не возвращает дубликатов строк.
А в мускуле приходилось в эту околесицу добавлять тот самый GROUP BY e.id или DISTINCT чтобы не выводил одинаковых строк для каждой записи в таблице experience.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409805
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvиспользуй IBExpert.
Собственно, в нём и разрабатывал.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37409908
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx> Собственно, в нём и разрабатывал.

Жаловаться на IBE, сравнивая с другими
инструментами, - это просто грех и ересь, ИМХО. :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410638
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY SUBSTRING("Name" FROM  1  FOR  3 ),  10 ;

Код: plaintext
1.
2.
3.
4.
5.
Invalid token.
Dynamic SQL Error.
SQL error code = - 104 .
Invalid command.
invalid ORDER BY clause.

В мускуле, опять же, прокатывало, отображало сначала сгруппированный по первым трём буквам столбец "Name", и уже только потом сортировал по "oLvl"

Текст в m.name содержится такой:
"Раз два три 1"
"Раз два три 2"
"Раз два три 3"
...
"Раз два три 99999"
"Два три четыре 1"
...
"Два три четыре 99999"
"Три четыре пять 1"
...
"Три четыре пять 99999"

Если из кода убрать SUBSTRING, то будет криво сортировать по oLvl, будет учитывать номер в тексте "Name"
Здесь про SUBSTRING ничего не сказано.

Вроде можно этот субстринг запихнуть в перечисление 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.
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY,
SUBSTRING(m.name FROM  1  FOR  3 ) AS CutName, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY,
SUBSTRING(m.name FROM  1  FOR  3 ) AS CutName, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY  5 ,  11 ;
Можно ли как-нибудь сделать выборку, не меняя количества выходных параметров?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410650
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут тоже про SUBSTRING ничего нет.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410660
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

а) накой там UNION ?
б) почему не UNION ALL ?
в) select * from (твой запрос без order by) order by чего надо
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410688
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

а) сначала выводятся строки с m.occupantUserId = NULL, а через UNION выводятся с m.occupantUserId = числу.
б) дубликатов строк не предвидится.
в) это зачем? Чтобы сортировка была для всего результата, а не для нижнего SELECT'а?
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410704
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

RTFM, RTFM и ещё много раз RTFM

а) решается обычным order by без union
б) т.е. на ненужную сортировку (о которой ты и не знаешь) тебе плевать
в) в UNION нет сортировки отдельных селектов, учи язык
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410738
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladdenixx,

RTFM, RTFM и ещё много раз RTFM

а) решается обычным order by без union
б) т.е. на ненужную сортировку (о которой ты и не знаешь) тебе плевать
в) в UNION нет сортировки отдельных селектов, учи язык

а) Мне нужно сортировать по полю с названием (m.name), и потом по полю с левелом (s.level). Если я вставлю в ORDER BY поле m.occupantUserId в начале ORDER BY, то это собъёт мне сортировку по названию (m.name). Если я вставлю это поле в конец ORDER BY, то это мне ничего не даст.
б) А можно поподробнее?
в) Я это понял ещё при использовании MySQL, просто увидел уже достаточно различий, чтобы спросить, не делается ли сортировка по отдельным селектам.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410813
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxа) Мне нужно сортировать по полю с названием (m.name), и потом по полю с левелом (s.level). Если я вставлю в ORDER BY поле m.occupantUserId в начале ORDER BY, то это собъёт мне сортировку по названию (m.name). Если я вставлю это поле в конец ORDER BY, то это мне ничего не даст.
б) А можно поподробнее?
в) Я это понял ещё при использовании MySQL, просто увидел уже достаточно различий, чтобы спросить, не делается ли сортировка по отдельным селектам. а) Нет. Тебе нужно сначала сортировать по m.occupantUserId is [not] null, а уже потом по m.name.

hint: используй CASE m.occupantUserId WHEN NULL THEN 0 ELSE 1 END

б) UNION DISTINCT каким образом удаляет дубликаты, по-твоему ?
в) Стандарт языка не зависит от СУБД. Правда MySQL ему редко следует. Но не до такой же степени.

Итого - учиться, учиться и учиться. А до "Готовлю базу данных для эксплуатации" ещё с годик подождать. Минимум.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37410908
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SELECT 
  m.id AS ID, 
  m.segmentId AS SID, 
m.x AS mX, m.y AS mY, m.name AS "NAME",
':) -Нет- :)' AS Occupant, '' AS oX, '' as oY, '' AS oName, '' AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId IS NULL
UNION
SELECT m.id AS ID, m.segmentId AS SID, m.x AS mX, m.y AS mY, m.name AS "NAME",
m.occupantUserId AS Occupant, s.x AS oX, s.y as oY, s.fullName AS oName, s.level AS oLvl,
m.resourceTotal AS RTotal, m.timeFound AS Created, m.timeToLiveDays AS Lives,
m.collectedResourceLimit AS "LIMIT", m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE m.x >= - 10000 
AND m.x <=  10000 
AND m.y >= - 10000 
AND m.y <=  10000 
AND m.occupantUserId=s.id
ORDER BY SUBSTRING("Name" FROM  1  FOR  3 ),  10 ;


Помоему при таком оформлении запрос читается гораздо лучше:

Код: 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.
SELECT 
  m.id                     AS ID,
  m.segmentId              AS SID,
  m.x                      AS mX,
  m.y                      AS mY,
  m.name                   AS "NAME",
  ':) -Нет- :)'            AS Occupant,
  ''                       AS oX,
  ''                       AS oY,
  ''                       AS oName,
  ''                       AS oLvl,
  m.resourceTotal          AS RTotal,
  m.timeFound              AS Created,
  m.timeToLiveDays         AS Lives,
  m.collectedResourceLimit AS "LIMIT",
  m.collectionTimeDelayHours
FROM mine AS m
WHERE (m.x >= - 10000 ) AND (m.x <=   10000 )
  AND (m.y >= - 10000 ) AND (m.y <=   10000 )
  AND (m.occupantUserId IS NULL)

UNION

SELECT
  m.id                     AS ID,
  m.segmentId              AS SID,
  m.x                      AS mX,
  m.y                      AS mY,
  m.name                   AS "NAME",
  m.occupantUserId         AS Occupant,
  s.x                      AS oX,
  s.y                      AS oY,
  s.fullName               AS oName,
  s.level                  AS oLvl,
  m.resourceTotal          AS RTotal,
  m.timeFound              AS Created,
  m.timeToLiveDays         AS Lives,
  m.collectedResourceLimit AS "LIMIT",
  m.collectionTimeDelayHours
FROM mine AS m, sector AS s
WHERE (m.x >= - 10000 ) AND (m.x <=   10000 )
  AND (m.y >= - 10000 ) AND (m.y <=   10000 )
  AND (m.occupantUserId = s.id)

ORDER BY
  SUBSTRING("Name" FROM  1  FOR  3 ),  10 
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411241
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему, пофиг.
Зато вот использование BETWEEN вместо этой лажи в условии сразу читаемости добавляет.
Ну и таки UNION ALL.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411366
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryНу и таки UNION ALL. Не нужен там UNION, никакой ;)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411442
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

А, ну да. Я в запрос не вчитывался. Точно, не нужен.
Имитация LEFT JOIN через UNION...
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411834
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladа) Нет. Тебе нужно сначала сортировать по m.occupantUserId is [not] null, а уже потом по m.name.
hint: используй CASE m.occupantUserId WHEN NULL THEN 0 ELSE 1 END
б) UNION DISTINCT каким образом удаляет дубликаты, по-твоему ?

б) Сделал UNION ALL, который, может, уберу, если разберусь с пунктом а).

hvladА до "Готовлю базу данных для эксплуатации" ещё с годик подождать. Минимум.
Готовлю базу данных для учебной эксплуатации в учебном проекте для изучения работы с БД в Java. Так хоть и "масляное масло", но понятнее будет, что я имел ввиду, когда писал эту фразу.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37411859
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixxГотовлю базу данных для учебной эксплуатации в учебном проекте для изучения работы с БД в JavaЭто совсем другое дело ;)
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414640
denixx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то FB медленно работает у меня с прогой.
Обрабатывает 14 записей в секунду. Потом постепенно планка опускается до 3-4 записей в секунду и потом прога зависает.
Пробовал ставить ClassicServer, через него работать - то же самое.

Технология следующая:
Открываем коннекшн.
Создаём CallableStatement.
Вызываем хранимую процедуру, которой передаём необходимые параметры.
ХП проверяет, если запись с таким ID уже есть в базе, обновляет эту запись. Если такого ID в базе нет, то делает инсерт.
ХП в выходную переменную сообщает результат, что она сделала, инсерт или апдейт.
Получаем этот результат и выводим в консоль.
Закрываем коннекшн.

Далее проделывается то же самое со следующей записью.

Мускул же обрабатывает 40-150 записей в секунду. Но там используется InnoDB, и если количество записей в секунду слишком большое, могут выскакивать эксепшены о том, что "буферная память переполнена (слишком много соединений?)".
Соединение используется только одно для всех потоков. Если быть точнее, то потоки синхронизируются по внешнему объекту, чтобы в базу в один момент времени писал только один поток.
Насколько я понимаю в мускуле просто используется буферизация в ОЗУ всего этого дела, а ФБ каждый раз обращается к диску для чтения/записи, потому и медленнее.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414674
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx,

Кхе-кхе. По "коннекшену" на каждую запись - это сильно!

Hint number one: вставлять/обновлять несколько записей можно и в одном подключении.
Hint number two: даже приведённая схема работы не должна приводить к зависанию - ищите, Шура, ищите глюки в коде.
...
Рейтинг: 0 / 0
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
    #37414742
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denixx Далее проделывается то же самое со следующей записью.
вы просто издеваетесь над сервером (или над собой).

denixxХП проверяет, если запись с таким ID уже есть в базе, обновляет эту запись. Если такого ID в базе нет, то делает инсерт.
http://www.ibase.ru/devinfo/testiu.htm

denixxи если количество записей в секунду слишком большое,
если записывать напрямую, без всяких одбц, ждбц, ado и прочего ужаса, то скорость вставки даже на десктопном компе может быть 24 тысячи записей в секунду .

denixxОбрабатывает 14 записей в секунду. Потом постепенно планка опускается до 3-4 записей в секунду и потом прога зависает.
стыдоба.
...
Рейтинг: 0 / 0
73 сообщений из 73, показаны все 3 страниц
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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