Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.08;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
6-24140
CrazyTemo
2002-05-22 17:53
2002.08.08
socket


6-24141
Димитрий
2002-05-24 13:00
2002.08.08
Помогите с сокетами через прокси плыз, плыз, плыз


3-23861
антон СПб ПП
2002-07-19 16:11
2002.08.08
Заголовок dbf файла


4-24265
Melamed
2002-05-31 00:19
2002.08.08
Проблема с написанием своего компанента


7-24239
limon
2002-05-22 11:11
2002.08.08
Вопрос о возможностях сервисов NT