Форум: "Базы";
Текущий архив: 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