![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Stored Procedure In IB
saxon © (2002-07-15 19:23:00)Кто подскажет?
пишу:
set term ^ ;
create procedure GetNewID ()
as
begin
select * from User; // линия 5
...
exit;
end
Выдает ошибку чтомол "Token unknown - line 5, char 6"
если вместо Select пишу delete - Ок
В чем трабл???????
SkyR (2002-07-17 01:48:00) [1]А ты почитай что я написал про хранимые процедуры!
Тебе НУЖНО использовать INTO т.к. по другому данные ты не получишь!
kaif (2002-07-16 18:55:00) [2]Скорее всего я ошибаюсь. Просто мне казалось, что строки
SELECT * FROM ... без INTO в IB-сервере именно в хранимых процедурах не криминальны, хоть и бессмысленны. Просто у меня в памяти вертится что-то такое. Возможно, это проходило (сдуру) в IB5.*, а может, у меня это осталось в памяти от общения с MSSQL...
Разумеется, так делать нельзя. Скорее всего, в IB6.0 и далее сервер уже ругается на такие конструкции.
FLAME (2002-07-16 18:41:00) [3]2 kaif © (15.07.02 23:20)
>Дело не в этом. IB обрабатывает и простые SELECT без SUSPEND и >переменных INTO...
IB обрабатывает, но не в SP. Или есть доказательства противного?
2 saxon © (16.07.02 11:58)
>Во нагородили:)
>Кто мне скажет, на содержание ошибки можно класть чтоли????
К сожалению в IB с диагностикой ошибок проблемы, поэтому очень часто текст ошибки не нужно понимать буквально. Особенно это относится к SP.
Johnmen (2002-07-16 12:00:00) [4]Если из огорода ничего не понял, то клади...:)))
saxon (2002-07-16 11:58:00) [5]Во нагородили:)
Кто мне скажет, на содержание ошибки можно класть чтоли????
Johnmen (2002-07-16 10:33:00) [6]>SkyR © (16.07.02 10:21)
>Весь косяк в том, что в IB, по-моему, процедура ОБЯЗАТЕЛЬНО >ДОЛЖНА содержать оператор SELECT вида SELECT …… From …….. INTO
IB здесь непричем ! Это общая концепция.
SkyR (2002-07-16 10:21:00) [7]Разобрался я с хранимыми процедурами!
Весь косяк в том, что в IB, по-моему, процедура ОБЯЗАТЕЛЬНО ДОЛЖНА содержать оператор SELECT вида
SELECT ……
From ……..
INTO ……
Обязательно нужно INTO.
Для примера привожу разбор своей хранимой процедуры:
SET TERM ^ ; /*Это нужно для того чтоб IB знал, где у нас кончается процедура, т.к. разделитель «;» “забит” для определения конца строки*/
--------------------
CREATE PROCEDURE SVOD_PROC /*Это понятно – создаем процедуру с именем SVOD_PROC */
RETURNS /*Здесь мы пишем, какие значения нам процедура должна вернуть в качестве результата*/
(
AGE INTEGER, /*Вычисляемое поле – возрастная группа*/
CAMP_NAME CHAR(249), /*Обычное поле - предприятие*/
RSUM NUMERIC(9, 3), /*Сумма исследований для клиента*/
RCOUNT INTEGER /*Количество исследований*/
)
AS
DECLARE VARIABLE rg_no char(6); /*Регистрационный номер. Мы объявляем данную переменную, т.к. она понадобится, чтобы донести номер до подзапросов*/
BEGIN
FOR SELECT ("17.07.2002"-date_b)/365,camp_name,serclients.reg_no /*В цикле выбираем данные из 2 таблиц где рег. Номера совпадают. Попутно вычисляем возраст. Все это запихиваем в переменные для возврата*/
FROM serclients,main
where main.reg_no=serclients.reg_no
INTO :age,:camp_name,:rg_no /*См. выше после RETURNS*/
DO
BEGIN
select sum(result) from main where main.reg_no=:rg_no into :rsum; /*И наконец. Для рег. Но считаем сумму и количество*/
select count(result) from main where main.reg_no=:rg_no into :rcount;
SUSPEND; /*Происходит выход из процедуры*/
END
EXIT;
END
^
-----------------------
А теперь подробнее как это работает:
Чтобы вызвать эту процедуру применительно ко ВСЕМ записям нужно использовать SELECT:
select distinct * from svod_proc
В результате для КАЖДОЙ записи в таблицах main и serclients будут подсчитаны необходимые значения.
Вот и ВСЕ!
Johnmen (2002-07-16 09:15:00) [8]SELECT ... INTO ...
Именно таков синтаксис селекта для использования в ХП.
Иначе, в процедуре - ошибка, в голове - бессмыслица...:)
Pingo (2002-07-16 04:42:00) [9]SET TERM !! ;
CREATE PROCEDURE testp1 (a integer, b integer)
returns (c integer, reg_no char(5))
as begin
select reg_no from main INTO REG_NO;
c=a+b;
exit;
end !!
SET TERM ; !!
И заработает
SkyR (2002-07-16 04:04:00) [10]У меня такая же фигня!
тока ошибку выдает в select в конце строки, типа ; - это и есть тот самый Token unknown
SET TERM !! ;
CREATE PROCEDURE testp1 (a integer, b integer)
returns (c integer, reg_no char(5))
as begin
select reg_no from main;
c=a+b;
exit;
end !!
SET TERM ; !!
И в чем дело????????????
kaif (2002-07-15 23:20:00) [11]2 FLAME (15.07.02 21:37)
Дело не в этом. IB обрабатывает и простые SELECT без SUSPEND и переменных INTO...
2 saxon © (15.07.02 19:23)
Скорее всего, ошибка просто в другом месте.
Token unknown - line 5, char 6
еще не означает, что это именно 5-я строка и 6-й символ исходной команды... (к сожалению).
Приведи весь текст полностью.
saxon (2002-07-15 21:43:00) [12]Нет это я так для примера показал
На самом деле у меня все как надо
Тем более что я его пример
вкинул себе (с таблицей и т.д.)
и все равно - трабл.
FLAME (2002-07-15 21:37:00) [13]Смотри внимательнее Awex © (15.07.02 19:54)
В процедурах IB допустим только select (for select) в переменные, а затем выдача их с помощью SUSPEND в выходные параметры процедуры. Курсор твоя процедура не может вернуть :(
saxon (2002-07-15 20:09:00) [14]Ну и в чем? ;)
Насколько я понял, то она не понимает
SELECT!!!
Awex (2002-07-15 19:54:00) [15]А примеры готовых процедур и найти разницу сам можешь ?
Example:
CREATE PROCEDURE SUB_TOT_BUDGET (HEAD_DEPT CHAR(3))
RETURNS (tot_budget DECIMAL(12, 2), avg_budget DECIMAL(12, 2),
min_budget DECIMAL(12, 2), max_budget DECIMAL(12, 2))
AS
BEGIN
SELECT SUM(BUDGET), AVG(BUDGET), MIN(BUDGET), MAX(BUDGET)
FROM DEPARTMENT
WHERE HEAD_DEPT = :head_dept
INTO :tot_budget, :avg_budget, :min_budget, :max_budget;
SUSPEND;
END !!