Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-24145
niko4543
2002-05-26 20:29
2002.08.08
Подскажите


1-24007
ivlex
2002-07-28 12:14
2002.08.08
Получение ASCII-кода символа


1-24008
eruc
2002-07-28 18:14
2002.08.08
hints (при неактивной форме)


1-23972
eruc
2002-07-26 23:39
2002.08.08
Speedbutton и курсор


1-24009
Солер
2002-07-28 14:14
2002.08.08
Как записать в Label значение combobox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский