powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
25 сообщений из 73, страница 1 из 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
25 сообщений из 73, страница 1 из 3
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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