Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Помогите пожалуйста разобраться с хранимой процедурой в IBExpert. / 25 сообщений из 73, страница 1 из 3
21.08.2011, 23:54
    #37405418
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Перевожу учебный проект с 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
22.08.2011, 00:24
    #37405433
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
И то, что я вместо DATETIME поставил timestamp, это правильно?
...
Рейтинг: 0 / 0
22.08.2011, 00:44
    #37405446
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
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
22.08.2011, 16:56
    #37406430
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в 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.
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
22.08.2011, 17:11
    #37406459
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
denixxOUT = ID: 1 FullName: Два Запись обновлена

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

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

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

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

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

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

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

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

-=-=-

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

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

denixxрешил сделать по образу и подобию, чтобы не сильно курочить уже готовый код в
Java.
Тебе всё равно придётся менять строчку вызова мускульной процедуры, так какая разница -
написать вместо неё "EXECUTE PROCEDURE" или "UPDATE OR INSERT"?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.08.2011, 18:13
    #37406542
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
denixxПока-что выбивает ошибку.
здесь подобные выражения, без указания точного сообщения об ошибке, дают повод заподозрить низкий IQ.
...
Рейтинг: 0 / 0
22.08.2011, 19:07
    #37406609
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
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
22.08.2011, 19:14
    #37406617
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
denixxprstmt.getResultSet();

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

О. Даже так...
А как же тогда вернуть из переменной текст?
Я с такой задачей ещё не сталкивался.
...
Рейтинг: 0 / 0
22.08.2011, 19:31
    #37406644
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
denixxА как же тогда вернуть из переменной текст?
То, что у неё на выходе не ResultSet, а скалярный вектор, тебя сбивает с толку? Почитай
справку по JDBC.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.08.2011, 19:35
    #37406645
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
denixxА как же тогда вернуть из переменной текст?Либо через Select from Proc, либо через выходные параметры после вызова Exec Proc.
И прочитай, наконец, статью, ссылку на которую тебе уже дали.
...
Рейтинг: 0 / 0
22.08.2011, 20:23
    #37406699
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
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
22.08.2011, 20:26
    #37406701
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Гаджимурадов Рустамчерез выходные параметры после вызова Exec Proc.
Интересует этот вариант.
Такого я ещё не делал вообще.

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

Задай вопрос в профильном форуме - помогут.
Ищи что-то вроде prstmt.Get_Нужный_Тип
...
Рейтинг: 0 / 0
22.08.2011, 20:30
    #37406703
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
...
Рейтинг: 0 / 0
22.08.2011, 22:59
    #37406897
denixx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Нашёл, наконец!
В мануале к 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
23.08.2011, 09:34
    #37407205
Микросекунда
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста разобраться с хранимой процедурой в IBExpert.
Dimitry Sibiryakov пишет:

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

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

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

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


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