![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с передачей параметров в хранимую процедуру [D6, IB6.x]
korvin © (2004-12-03 23:22:00)Есть хранимая на сервере процедура в которую нужно передать параметры DATA_FIRSTи DATE_LAST(тип DATE) из программы
И тут проблема - параметры не обязательные и юзеру позволено их опустить,
Используются так:
and (DATA_DOK>=:DATE_FIRST)
and (DATA_DOK<=:DATE_LAST)
но получение такого параметра с значением nul даёт пустой результат на выходе.
Как передавать параметры в процедуру при выполнении программы?
Как не задавая один или оба эти параметра получить результат процедуры?
Zacho (2004-12-25 16:35:00) [1]DSKalugin © (25.12.04 13:41) [12]
Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?
Может проще, может нет. В ХП ведь может быть не только один запрос, но и какие-либо другие действия :) , к-рые надо делать именно в ХП, а не в приложении.
DSKalugin (2004-12-25 13:41:00) [2]2 Zacho © (04.12.04 18:52) [11]
Спасибо, понял. Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?
Zacho (2004-12-04 18:52:00) [3]
> DSKalugin © (04.12.04 18:12) [10]
Выдержка из документации подойдет ?
EXECUTE STATEMENT
PSQL extension which takes a string which is a valid dynamic SQL statement and executes it as if it had
been submitted to DSQL.
Available in triggers and stored procedures.
The syntax may have three forms.
Syntax 1
Executes <string> as SQL operation that does not return any data rows, viz. INSERT, UPDATE, DELETE,
EXECUTE PROCEDURE or any DDL statement except CREATE/DROP DATABASE.
EXECUTE STATEMENT <string>;
Example
CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
Firebird 1.5 Release Notes v.1.08 5 February 2004 Page 21
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = ’EXECUTE PROCEDURE ’ || Pname || ’(’;
Sql = Sql || CAST(Par AS VARCHAR(20)) || ’)’;
EXECUTE STATEMENT Sql;
END
Syntax 2
Executes <string> as SQL operation, returning single data row. Only singleton SELECT operators may be
executed with this form of EXECUTE STATEMENT.
EXECUTE STATEMENT <string> INTO :var1, […, :varn] ;
Example
CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;
BEGIN
EXECUTE STATEMENT ’SELECT MAX(CheckField) FROM ’ || TableName INTO :Par;
IF (Par > 100) THEN
EXCEPTION Ex_Overflow ’Overflow in ’ || TableName;
END
Syntax 3
Executes <string> as SQL operation, returning multiple data rows. Any SELECT operator may be
executed with this form of EXECUTE STATEMENT.
FOR EXECUTE STATEMENT <string> INTO :var1, …, :varn DO
<compound-statement>;
Example
CREATE PROCEDURE DynamicSampleThree (
TextField VARCHAR(100),
TableName VARCHAR(100))
RETURNS (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);
BEGIN
Line = ’’;
FOR EXECUTE STATEMENT
’SELECT ’ || TextField || ’ FROM ’ || TableName INTO :OneLine
DO
IF (OneLine IS NOT NULL) THEN
Line = Line || OneLine || ’ ’;
SUSPEND;
END
DSKalugin (2004-12-04 18:12:00) [4]2 Zacho © (04.12.04 17:47) [9]
переходи на FB 1.5 и используй EXECUTE STATEMENT
а можно уточнить? что это за зверь EXECUTE STATEMENT и как в данном случае его тут использовать
Zacho (2004-12-04 17:47:00) [5]korvin © (04.12.04 16:16) [5]
Читай хелп по используемым тобой компонентам, в нём всё должно быть написано.
korvin © (04.12.04 16:18) [6]
Или DSKalugin © (04.12.04 17:27) [8] , или переходи на FB 1.5 и используй EXECUTE STATEMENT, или создай отдельную табличку для параметров.
DSKalugin (2004-12-04 17:27:00) [6]Отказаться от идеи работать с использованием хранимой процедуры и перейти на ипользование обычного динамическиформируемого в процессе работы запроса
для этого можно менять одну строку в готовом запросе
Query1.close;
Query1.SQL.Strings[16]:=VarSQL_TEXT;
Query1.open;
или весь текст SQL
Ильичев С.А. (2004-12-04 16:47:00) [7]2 [5] korvin © (04.12.04 16:16)
> Остался ещё один вопрос - как передавать значения входящего
> параметра в процедуру во время работы программы.
=))
У меня вопрос посложнее.
Как передавать значения входящего параметра в процедуру в то время когда программа не работает.
korvin (2004-12-04 16:18:00) [8]Есть ещё одна проблемка. Кроме параметров дат в процедуру хотел передавать ещё несколько параметров, но их количетво сзаранее неизвестно.
Например, есть поле POLE1 (varchar(1)) и нужно получить на выходе из процедуры таблицу с значениями этого поля равными '1' и '2', в другом случае может потребоваться поставить условия отбора равными '0','1','5','7'...
Как организовать такую процедуру. Ведь сзаранее неизвестно количество входящих параметров.
Может какой цыкл в процедуре закрутить? А не то вообще под каждый отдельный запрос мастерить свою процедуру в рантайм, а потом её убивать?
korvin (2004-12-04 16:16:00) [9]Остался ещё один вопрос - как передавать значения входящего параметра в процедуру во время работы программы.
korvin (2004-12-04 08:23:00) [10]Johnmen © (04.12.04 01:39) [3]
А ведь правда ;)
Наверно плохо вечером уже мозги ворочались, что не додумался, спасибо.
Johnmen (2004-12-04 01:39:00) [11]
and ((:opustitь=1) or (DATA_DOK>=:DATE_FIRST))
DrPass (2004-12-03 23:31:00) [12]Ну так проверяй их перед тем как выполнять процедуру -
if (data_dok is null) then ... else ...
Ильичев С.А. (2004-12-03 23:30:00) [13]Так а ты проверяй перед вызовом процедуры.
Если не задана например DATE_FIRST то задавай
её сам - минимальное возможное значение (если я
правильно понял по смыслу) 12/30/1899
иль в самой процедуре такую же проверочку