nikedeforest
|
|
« : 09-12-2004 14:29 » |
|
Пишу простенькую хранимую процедуру и при запуске вывваливается Invalid command. SQL error code = -104. Подскажите где я не прав set term!! create procedure find_ivan returns )max_kol integer: as declare variable schet integer; declare variable name varchar)18:; declare variable scablon varchar)18:; begin max_kol=0; schet=1; scablon='Ivanov'; while)schet<=max)sklad.pn::do begin select sk.otvet from sklad sk where sklad.pn=schet into {name; if )name=scablon: then max_kol=max_kol+1;
schet=schet+1; end suspend; end!! set term ;
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #1 : 09-12-2004 15:02 » |
|
nikedeforest, я конечно могу и ошибаться, но мне кажется, что процедура не должна возвращать никаких значений по крайней мере в MSSQL у хранимых процедур, даже немного другой синтаксис: create procedure XXX @y as ... go
, где @Y - параметр, если нужен
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #2 : 09-12-2004 15:10 » |
|
синтаксис процедуры Interbase/Firebird. если ты пытаешься проливать его на MS SQL - ... . таких операторов, как suspend там в принципе нету, да и SET TERM вообще не нужент.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 09-12-2004 15:13 » |
|
Это что? хранимая процедура SQL Server? я не узнаю Transact-SQL в гриме... В частности, что такое ":name"? что такое "while(schet<=max(sklad.pn))do"? Почему к полю обращаются вне select? что означают блоки begin ... end с завершающим suspend и восклицательными знаками? Это SQL Server какой версии? Это явно какая-то попытка использовать SQL не по назначению :? и перепутано с C/C++ по синтаксису... Опиши задачу! Подобная расчётая задача иначе решается на SQL.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #4 : 09-12-2004 15:13 » |
|
а с точки зрения Ib ошибка в том, что операторы SET TERM должны быть закрыты текущим терминатором, т.е.
SET TERM ^;
CREATE ... END ^
SET TERM ;^
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #5 : 09-12-2004 15:17 » |
|
dimka, думается, имеет место попытка засунуть процедуру, написанную для interbase в mssql причём сама процедура оформлена не совсем правильно
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #6 : 09-12-2004 15:22 » |
|
кстати, насчёт while - да, тут тоже парень погорячился. там надо делать
FOR SELECT (..) DO BEGIN ... END;
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #7 : 09-12-2004 16:04 » |
|
Ну вы меня тут на костре сожгете :oops: . Это все пишется на interbase который был на диске вместе с Delphi 7. (На счет SQL Server я ошибся :oops: , ну со мной такое часто бывает ) На счет set term, то это я вам точно говорю, без него работать не будет. В институте работает, но там другой interbase(или что-то еще). Это кстати оспаривать не надо, т.к. когда я писал триггер, то в институте я писал без set term, а дома пришлось с set term. suspend этот оператор возвращает значение в место откуда была вызванв процедура. (Это из книги по Дельфи и в принципе верно). :name - таким образом заносится значение в переменную name когда юзаешь select а вот еще когда нодо ставить : и когда не надо в этом я не уверен. Знаю что при сравнении не надо ставить и при присваивании. FOR SELECT (..) DO BEGIN - возможно, но я не хотел экспериментировать, в придачу ведь все-равно можно делать без for select . Но вы тут не зря меня материли и я (прям только что)нашел правильный (с точки зрения грамматики) путь вот если интересно: set term!! create procedure find_ivan returns )max_kol integer: as declare variable schet integer; declare variable name varchar)18:; declare variable scablon varchar)18:; declare variable vsego integer; begin max_kol=0; schet=1; scablon='Ivanov'; select max)sklad.kluch: from sklad into {vsego; while)schet<=vsego:do begin select sk.otvet from sklad sk where sklad.kluch={schet into {name; if )name=scablon: then max_kol=max_kol+1;
schet=schet+1; end suspend; end!! set term ;
спасибо dimka, именно ты подсказал верно. Но и спасибо всем за внимание . p.s. x77, именно благодаря тебе я вспомнил что это был interbase, надеюсь я не ошибся .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #8 : 09-12-2004 16:22 » |
|
nikedeforest, я вот чего не пойму... тебе требуется получить кол-во записей из таблицы sklad, где kluch = :schet и name = scablon, правильно? почему бы так и не написать: set term!! create procedure find_ivan )scablon varchar )255:: returns )max_kol integer: as begin select count )*: from sklad where name={scablon into {max_col; end!! set term ;
я не понимаю смысла всех прочих манипуляций: заводить локальную переменную, в цикле увеличивать её на один, для каждого значения находить запись, делать выборку по ключу в переменную, сравнивать её с другой переменной.... это явный бред, imho, всё делается намного проще.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #9 : 09-12-2004 16:22 » |
|
Вот еще такой вопрос, я могу в select вызвать процедуру, чтобы результат ее работы сразу выводился бы на экран?? Если могу, то можно пример того как это сделать правильно.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #10 : 09-12-2004 16:30 » |
|
nikedeforest, легко:
select p.* from <имя процедуры> p
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #11 : 09-12-2004 16:34 » |
|
оператор suspend, кстати, нужен далеко не всегда. он используется, когда ты в цикле выдаёшь на экран несколько записей, т.е. формируешь результрующий набор данных. вот тогда в каждой итерации цикла вызывается suspend. а если твоя процедура возвращает всего одну запись (из одного и боле полей), то необходимости в нём нет - ты просто заполняешь эти поля и автоматом получишь их значения на выходе.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 09-12-2004 16:41 » |
|
x77, поддерживаю. Это попытка реализации именно его P.S. срочно нужно следующую статью выпускать, там как раз про группировки будет...
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
nikedeforest
|
|
« Ответ #13 : 09-12-2004 16:51 » |
|
Х77, спасибо то что надо !!! На счет suspend я его тогда еще понял как return в Си и теперь использую по аналогии
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #14 : 09-12-2004 16:58 » |
|
nikedeforest, ты лучше процедуру перепиши по-нормальному нет, suspend это не return. это команда серверу выдать в результирующий набор данных запись в виде набора текущих значений выходных параметров и продолжить работу. в твоём случае эта команда вообще не нужна.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #15 : 09-12-2004 17:01 » |
|
dimka, ох, про статьи не напоминай ...
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #16 : 09-12-2004 18:28 » |
|
Да я перепишу, хотя это все ради того, чтобы лабораторную засчитали, а преподу оно и так прокатит
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #17 : 09-12-2004 18:49 » |
|
лихой у вас препод, однако... был у нас один такой в лицее, никогда не забуду, как он исходник программы из оболочки Turbo Pascal 7.0 распечатывал: PrintScreen / PageDown ... PrintScreen / PageDown ... PrintScreen / PageDown ......... песня.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #18 : 09-12-2004 19:41 » |
|
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #19 : 10-12-2004 18:15 » |
|
nikedeforest, а жаль... у нас препод по 3 раза посылал "подумать ещё", чтобы написать оптимальное решение, за что ему и спасибо
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
nikedeforest
|
|
« Ответ #20 : 10-12-2004 18:46 » |
|
dimka, у на тоже такие есть, но если все такими будут, то так можно думалку совсем сломать. У нас в прошлом году философия была, вот если бы она по три раза отправляла бы подумать... это ж кабздец .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
|