Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

получить результат ХП   Найти похожие ветки 

 
3APA3A   (2004-07-03 15:02) [0]

У меня есть ХП. Входные параметры - 2 VARCHAR переменные. Выходные - 1 типа INTEGER.  Как мне вызвать эту ХП в клиентском приложении и получить результат?
 Пробовал через TIBQuery
.SQL.Text := "execute procedure MyProc(""Param1"", ""Param2"")";
.Open;
Ничего не возвращает, хотя если в IBConsole написать то же самое - все нормально, то есть дело не в ХП.


 
menart ©   (2004-07-03 15:13) [1]

что такое ХР?


 
3APA3A   (2004-07-03 15:18) [2]

хранимая процедура  =)


 
Sergey Masloff   (2004-07-03 15:49) [3]

>SQL.Text := "execute procedure MyProc(""Param1"", ""Param2"")";
>.Open;
Опен можно писать только если хапрос возвращает НД (ТОЛЬКО select)
То есть пиши select * from MyProc(:Param1, :Param2)
или извращайся с RETURN VALUES но тогда не пиши опен а пиши ExecXXX или как там.


 
3APA3A   (2004-07-03 15:54) [4]

В общем, процедура выглядит так
CREATE PROCEDURE LOGIN (NAME VARCHAR(32),PWD VARCHAR(32))
RETURNS (RIGHTS INTEGER)
AS
BEGIN
 RIGHTS = 0;
 SELECT RIGHTS FROM USERS WHERE NAME = :NAME AND PWD = :PWD INTO    :RIGHTS;
END

Как вызвать процедуру и получить результат в программе?


 
Sergey Masloff   (2004-07-03 16:21) [5]

я уже написал


 
3APA3A   (2004-07-03 16:50) [6]

Не получается у меня.
Засовываю в Query.Params строки "Str1", "Str2". пишу Query.Open.
В DBGrid"е ничего нет.  Как правильно сделать?


 
GanibalLector ©   (2004-07-03 16:58) [7]

2 ALL
Вы чЁ???
А компонент StoredProc на что?Если у тя IB то используй IbStoredProc.
Пример :
IbStoredProc1.ParamByName("первый параметр").value:=Edit10.text;
IbStoredProc1.ParamByName("второй параметр").value:=Edit11text;
IbStoredProc1.ExecProc;
Label1.Caption:=IbStoredProc1.ParamByName("выход").value;


 
DrPass ©   (2004-07-03 17:17) [8]

CREATE PROCEDURE LOGIN (NAME VARCHAR(32),PWD VARCHAR(32))
RETURNS (RIGHTS INTEGER)
AS
BEGIN
RIGHTS = 0;
FOR
SELECT RIGHTS FROM USERS WHERE NAME = :NAME AND PWD = :PWD INTO    :RIGHTS
DO SUSPEND;
END

А для чтения результата выполняешь обычный запрос вида select * from login...


 
Sergey Masloff   (2004-07-03 17:19) [9]

GanibalLector ©   (03.07.04 16:58) [7]
GanibalLector ©   (03.07.04 16:58) [7]
>2 ALL
>Вы чЁ???
Еще один советчик.
Господин хороший, прежде чем давать советы изучите получше матчасть. С приведенной процедурой Ваш способ не саботает. Это раз. Потому что как мы видим в процедуре нет магического слова suspend и она ничего не выдает клиенту, которому в свою очередь, нечего выводить в DBGrid. Это раз. Во вторых использовать компоненты StoredProc (которые в IBX включены ТОЛЬКО для упрощения переходв с BDE) не слишком хорошо так как в них полно ошибок (так как писали второпях и на коленке) и их использование может привести к очень серьезным проблемам в то время как приведенный мной способ (через Query и SELECT) является переносимым и безопасным.


 
Sergey Masloff   (2004-07-03 17:21) [10]

DrPass ©   (03.07.04 17:17) [8]
Ну если результат гарантированно 1 то for не нужно в селекте а по сути все верно.


 
GanibalLector ©   (2004-07-03 17:23) [11]

2 Sergey Masloff
Ну...бывает.Я ж не волшебник,а только учусь.


 
Sergey Masloff   (2004-07-03 17:25) [12]

GanibalLector ©   (03.07.04 17:23) [11]
>Ну...бывает.Я ж не волшебник,а только учусь.
Да конечно бывает... главное чтобы учился ;-)


 
GanibalLector ©   (2004-07-03 17:28) [13]

2 Sergey Masloff  

>Во вторых использовать компоненты StoredProc (которые в IBX включены ТОЛЬКО для упрощения переходв с BDE) не слишком хорошо так как в них полно ошибок (так как писали второпях и на коленке) и их использование может привести к очень серьезным проблемам в то время как приведенный мной способ (через Query и SELECT) является переносимым и безопасным.

А откуда,кстати,такая информация???Лично у меня в проекте их МНОГО.Да и проект работает ужО больше года,пока нареканий не было.И еще,а если ХП без выходных параметров,как тогда запрос писать?


 
Sergey Masloff   (2004-07-03 17:36) [14]

>А откуда,кстати,такая информация???
Информация 100% достоверная, глюк был известен много лет но автор IBX делал вид что ничего об этом не знает, потом всякие заплатки лепили... Вобщем на ibase.ru есть статья по этому поводу - очень хорошая и с обзором всей истории.

>И еще,а если ХП без выходных параметров,как тогда запрос писать?
execute procedure MyProc
и вместо Open ExecSQL (или ExecQuery в зависимости от того какая компонента)


 
}{ander ©   (2004-07-04 01:22) [15]

2 Sergey Masloff
> Потому что как мы видим в процедуре нет магического слова
> suspend и она ничего не выдает клиенту

Вы, наверное, очнь удивитесь, но выдает (на IBX 6.07 точно)! Попробуйте, прежде чем столь категорично заявлять...

> Во вторых использовать компоненты StoredProc (которые в
> IBX включены ТОЛЬКО для упрощения переходв с BDE) не слишком
> хорошо так как в них полно ошибок


> Информация 100% достоверная

Пожалуйста, предъявите источник


 
sniknik ©   (2004-07-04 02:54) [16]

> Пожалуйста, предъявите источник
http://ibase.ru/devinfo/ibstp.htm


 
Sergey Masloff   (2004-07-04 10:30) [17]

}{ander ©   (04.07.04 01:22) [15]
>Вы, наверное, очнь удивитесь, но выдает (на IBX 6.07 точно)! >Попробуйте, прежде чем столь категорично заявлять...
Ваше упоминание про версию IBX показывает что вы не совсем понимаете о чем идет речь. Для выдачи результата процедуры через параметр при использовании TXXStoredProc suspend действительно не требуется, но при этом возникают другие проблемы. Для использования безопасного вызова через курсор (используя SELECT) suspend необходим и в этом можно легко убедиться написав за 10 минут маленький пример.
 Версия IBX либо других компонент тут не при чем.


 
}{ander ©   (2004-07-04 11:09) [18]

2 Sergey Masloff

> Ваше упоминание про версию IBX показывает что вы не совсем
> понимаете о чем идет речь

IBX упомянул только для общности картины (разные компоненты могут иметь разную функциональность).
> Потому что как мы видим в процедуре нет магического слова
> suspend и она ничего не выдает клиенту


> Для выдачи результата процедуры через параметр при использовании
> TXXStoredProc suspend действительно не требуется

Вопрос: какому из Ваших постов верить?

С уважением


 
Sergey Masloff   (2004-07-04 11:22) [19]

}{ander ©   (04.07.04 11:09) [18] > Для выдачи результата >процедуры через параметр при использовании
> TXXStoredProc suspend действительно не требуется
Да, и на старуху бывает проруха ;-)
На самом деле детали вспомнил уже в ходе обсуждения

>С уважением
взаимно


 
kaif ©   (2004-07-05 04:34) [20]

Можно обойтись и без SUSPEND.
Если я правильно помню, можно просто вписать
execute procedure MyProc(:Param1, :Param2)returning_values :Param3
Кстати, этот синтакис особенно хорош при вызове процедур друг из друга на сервере, если они априори возвращают значения, а не набор. Если нужен набор строк, то тогда уже используется синтаксис for select ... into ... do


 
Deniz ©   (2004-07-05 06:10) [21]

> }{ander ©   (04.07.04 01:22) [15]
> Вы, наверное, очнь удивитесь, но выдает (на IBX 6.07 точно)!

Советую обновить до х.08! х-версия Delphi


 
Digitman ©   (2004-07-05 09:49) [22]


> 3APA3A   (03.07.04 16:50) [6]
> Не получается у меня.
> Засовываю в Query.Params строки "Str1", "Str2". пишу Query.Open.
> В DBGrid"е ничего нет.  Как правильно сделать?


раз речь пошла о гриде, то и НД, с которым связан грид, должен быть селективным

этто означает, что если НД формируется средствами ХП, то там обязательно должен присутствовать SUSPEND

CREATE PROCEDURE LOGIN (NAME VARCHAR(32),PWD VARCHAR(32))
RETURNS (RIGHTS INTEGER)
AS
BEGIN
RIGHTS = 0;
SELECT RIGHTS
FROM USERS
WHERE NAME = :NAME AND PWD = :PWD
INTO    :RIGHTS;
SUSPEND;
END

тогда

with IBQuery do
begin
SQL.Text := "SELECT * FROM LOGIN(?Param1, ?Param2)";
ParamByName("Param1").Value := "SOMEUSERNAME";
ParamByName("Param2").Value := "SOMEPASSWORD";
Open; //метод только для селективных запросов, возвращающих курсируемый НД !
end;


 
Digitman ©   (2004-07-05 09:54) [23]


> НД, с которым связан грид, должен быть селективным


эт я глупость, конечно, ляпнул

имелось ввиду, что запрос, возвращающий курсируемый НД, должен быть только селективным (т.е. базироваться на SQL SELECT-предложении) и никаким иным



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.036 c
3-1089281653
AlexnaderSK
2004-07-08 14:14
2004.08.01
Возможно ли в IB создать именованное ограничение NOT NULL?


14-1089823715
VID
2004-07-14 20:48
2004.08.01
Совместное использование ресурсов компьютера в сети. Как ?


1-1089879538
half_litre
2004-07-15 12:18
2004.08.01
NoModalForm в Dll и Exception


14-1089575518
VID
2004-07-11 23:51
2004.08.01
Откуда бы достать русский хелп для ZoneAlarm ?


8-1084576073
Женька
2004-05-15 03:07
2004.08.01
BMP...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский