Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: storage procedure in Sql Server  (Прочитано 22442 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 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
Молодой специалист

ru
Offline 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
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 09-12-2004 15:10 » new

синтаксис процедуры Interbase/Firebird. если ты пытаешься проливать его на MS SQL - ... . таких операторов, как suspend там в принципе нету, да и SET TERM вообще не нужент.
Записан

Dimka
Деятель
Команда клуба

ru
Offline 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
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 09-12-2004 15:13 » 

а с точки зрения Ib ошибка в том, что операторы SET TERM должны быть закрыты текущим терминатором, т.е.

SET TERM ^;

CREATE ...
END ^

SET TERM ;^
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 09-12-2004 15:17 » 

dimka, думается, имеет место попытка засунуть процедуру, написанную для interbase в mssql Улыбаюсь причём сама процедура оформлена не совсем правильно Улыбаюсь
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 09-12-2004 15:22 » 

кстати, насчёт while - да, тут тоже парень погорячился. там надо делать

FOR SELECT (..) DO
  BEGIN
    ...
  END;
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ro
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 09-12-2004 16:22 » 

Вот еще такой вопрос, я могу в select вызвать процедуру, чтобы результат ее работы сразу выводился бы на экран??
Если могу, то  можно пример того как это сделать правильно.
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 09-12-2004 16:30 » 

nikedeforest, легко:

select p.*
from <имя процедуры> p
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 09-12-2004 16:34 » 

оператор suspend, кстати, нужен далеко не всегда. он используется, когда ты в цикле выдаёшь на экран несколько записей, т.е. формируешь результрующий набор данных. вот тогда в каждой итерации цикла вызывается suspend. а если твоя процедура возвращает всего одну запись (из одного и боле полей), то необходимости в нём нет - ты просто заполняешь эти поля и автоматом получишь их значения на выходе.
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 09-12-2004 16:41 » 

x77, поддерживаю. Это попытка реализации именно его Улыбаюсь

P.S.
срочно нужно следующую статью выпускать, там как раз про группировки будет...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 09-12-2004 16:51 » 

Х77, спасибо то что надо  Отлично !!!
На счет suspend я его тогда еще понял как return в Си и теперь использую по аналогии  Улыбаюсь
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #14 : 09-12-2004 16:58 » 

nikedeforest, ты лучше процедуру перепиши по-нормальному Ага

нет, suspend это не return. это команда серверу выдать в результирующий набор данных запись в виде набора текущих значений выходных параметров и продолжить работу. в твоём случае эта команда вообще не нужна.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 09-12-2004 17:01 » 

dimka, ох, про статьи не напоминай ...
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 09-12-2004 18:28 » 

Да я перепишу, хотя это все ради того, чтобы лабораторную засчитали, а преподу оно и так прокатит Отлично
Записан

ещё один вопрос ...
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #17 : 09-12-2004 18:49 » 

лихой у вас препод, однако...   был у нас один такой в лицее, никогда не забуду, как он исходник программы из оболочки Turbo Pascal 7.0 распечатывал: PrintScreen / PageDown ... PrintScreen / PageDown ... PrintScreen / PageDown .........  песня.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 09-12-2004 19:41 » 

x77,  Отлично  Отлично  Отлично  Отлично  Отлично
у нас попроще, ему просто на все побарабану, его еще фиг заставишь подойти к компьютеру, чтобы показать прогу, короче пофигист полный.
Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 10-12-2004 18:15 » 

nikedeforest, а жаль... у нас препод по 3 раза посылал "подумать ещё", чтобы написать оптимальное решение, за что ему и спасибо
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 10-12-2004 18:46 » 

dimka, у на тоже такие есть, но если все такими будут, то так можно думалку совсем сломать. У нас в прошлом году философия была, вот если бы она по три раза отправляла бы подумать... это ж кабздец Улыбаюсь.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines