Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизStored Procedure In IB Найти похожие ветки
← →
saxon (2002-07-15 19:23) [0]Кто подскажет?
пишу:
set term ^ ;
create procedure GetNewID ()
as
begin
select * from User; // линия 5
...
exit;
end
Выдает ошибку чтомол "Token unknown - line 5, char 6"
если вместо Select пишу delete - Ок
В чем трабл???????
← →
Awex (2002-07-15 19:54) [1]А примеры готовых процедур и найти разницу сам можешь ?
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 !!
← →
saxon (2002-07-15 20:09) [2]Ну и в чем? ;)
Насколько я понял, то она не понимает
SELECT!!!
← →
FLAME (2002-07-15 21:37) [3]Смотри внимательнее Awex © (15.07.02 19:54)
В процедурах IB допустим только select (for select) в переменные, а затем выдача их с помощью SUSPEND в выходные параметры процедуры. Курсор твоя процедура не может вернуть :(
← →
saxon (2002-07-15 21:43) [4]Нет это я так для примера показал
На самом деле у меня все как надо
Тем более что я его пример
вкинул себе (с таблицей и т.д.)
и все равно - трабл.
← →
kaif (2002-07-15 23:20) [5]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-й символ исходной команды... (к сожалению).
Приведи весь текст полностью.
← →
SkyR (2002-07-16 04:04) [6]У меня такая же фигня!
тока ошибку выдает в 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 ; !!
И в чем дело????????????
← →
Pingo (2002-07-16 04:42) [7]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 ; !!
И заработает
← →
Johnmen (2002-07-16 09:15) [8]SELECT ... INTO ...
Именно таков синтаксис селекта для использования в ХП.
Иначе, в процедуре - ошибка, в голове - бессмыслица...:)
← →
SkyR (2002-07-16 10:21) [9]Разобрался я с хранимыми процедурами!
Весь косяк в том, что в 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 10:33) [10]>SkyR © (16.07.02 10:21)
>Весь косяк в том, что в IB, по-моему, процедура ОБЯЗАТЕЛЬНО >ДОЛЖНА содержать оператор SELECT вида SELECT …… From …….. INTO
IB здесь непричем ! Это общая концепция.
← →
saxon (2002-07-16 11:58) [11]Во нагородили:)
Кто мне скажет, на содержание ошибки можно класть чтоли????
← →
Johnmen (2002-07-16 12:00) [12]Если из огорода ничего не понял, то клади...:)))
← →
FLAME (2002-07-16 18:41) [13]2 kaif © (15.07.02 23:20)
>Дело не в этом. IB обрабатывает и простые SELECT без SUSPEND и >переменных INTO...
IB обрабатывает, но не в SP. Или есть доказательства противного?
2 saxon © (16.07.02 11:58)
>Во нагородили:)
>Кто мне скажет, на содержание ошибки можно класть чтоли????
К сожалению в IB с диагностикой ошибок проблемы, поэтому очень часто текст ошибки не нужно понимать буквально. Особенно это относится к SP.
← →
kaif (2002-07-16 18:55) [14]Скорее всего я ошибаюсь. Просто мне казалось, что строки
SELECT * FROM ... без INTO в IB-сервере именно в хранимых процедурах не криминальны, хоть и бессмысленны. Просто у меня в памяти вертится что-то такое. Возможно, это проходило (сдуру) в IB5.*, а может, у меня это осталось в памяти от общения с MSSQL...
Разумеется, так делать нельзя. Скорее всего, в IB6.0 и далее сервер уже ругается на такие конструкции.
← →
SkyR (2002-07-17 01:48) [15]А ты почитай что я написал про хранимые процедуры!
Тебе НУЖНО использовать INTO т.к. по другому данные ты не получишь!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c