Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Проблема с передачей параметров в хранимую процедуру   Найти похожие ветки 

 
korvin ©   (2004-12-03 23:22) [0]

Есть хранимая на сервере процедура в которую нужно передать параметры DATA_FIRST и DATE_LAST (тип DATE) из программы
И тут проблема - параметры не обязательные и юзеру позволено их опустить,
Используются так:
and (DATA_DOK>=:DATE_FIRST)
and (DATA_DOK<=:DATE_LAST)

но получение такого параметра с значением nul даёт пустой результат на выходе.
Как передавать параметры в процедуру при выполнении программы?
Как не задавая один или оба эти параметра получить результат процедуры?


 
Ильичев С.А. ©   (2004-12-03 23:30) [1]

Так а ты проверяй перед вызовом процедуры.
Если не задана например DATE_FIRST то задавай
её сам - минимальное возможное значение (если я
правильно понял по смыслу) 12/30/1899

иль в самой процедуре такую же проверочку


 
DrPass ©   (2004-12-03 23:31) [2]

Ну так проверяй их перед тем как выполнять процедуру -
if (data_dok is null) then ... else ...


 
Johnmen ©   (2004-12-04 01:39) [3]

and ((:opustitь=1) or (DATA_DOK>=:DATE_FIRST))


 
korvin ©   (2004-12-04 08:23) [4]

Johnmen ©   (04.12.04 01:39) [3]
А ведь правда ;)
Наверно плохо вечером уже мозги ворочались, что не додумался, спасибо.


 
korvin ©   (2004-12-04 16:16) [5]

Остался ещё один вопрос - как передавать значения входящего параметра в процедуру во время работы программы.


 
korvin ©   (2004-12-04 16:18) [6]

Есть ещё одна проблемка. Кроме параметров дат в процедуру хотел передавать ещё несколько параметров, но их количетво сзаранее неизвестно.
Например, есть поле POLE1 (varchar(1)) и нужно получить на выходе из процедуры таблицу с значениями этого поля равными "1" и "2", в другом случае может потребоваться поставить условия отбора равными "0","1","5","7"...
Как организовать такую процедуру. Ведь сзаранее неизвестно количество входящих параметров.
Может какой цыкл в процедуре закрутить? А не то вообще под каждый отдельный запрос мастерить свою процедуру в рантайм, а потом её убивать?


 
Ильичев С.А. ©   (2004-12-04 16:47) [7]

2 [5] korvin ©   (04.12.04 16:16)

> Остался ещё один вопрос - как передавать значения входящего
> параметра в процедуру во время работы программы.


=))
У меня вопрос посложнее.
Как передавать значения входящего параметра в процедуру в то время когда программа не работает.


 
DSKalugin ©   (2004-12-04 17:27) [8]

Отказаться от идеи работать с использованием хранимой процедуры и перейти на ипользование обычного динамическиформируемого в процессе работы запроса

для этого можно менять одну строку в готовом запросе
Query1.close;
Query1.SQL.Strings[16]:=VarSQL_TEXT;
Query1.open;

или весь текст SQL


 
Zacho ©   (2004-12-04 17:47) [9]

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 18:12) [10]

2 Zacho ©   (04.12.04 17:47) [9]
переходи на FB 1.5 и используй EXECUTE STATEMENT

а можно уточнить? что это за зверь EXECUTE STATEMENT и как в данном случае его тут использовать


 
Zacho ©   (2004-12-04 18:52) [11]


> 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-25 13:41) [12]

2 Zacho ©   (04.12.04 18:52) [11]

Спасибо, понял. Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?


 
Zacho ©   (2004-12-25 16:35) [13]

DSKalugin ©   (25.12.04 13:41) [12]
Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?


Может проще, может нет. В ХП ведь может быть не только один запрос, но и какие-либо другие действия :) , к-рые надо делать именно в ХП, а не в приложении.



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

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
1-1105960029
sasha-bumer
2005-01-17 14:07
2005.01.30
Flash


3-1103832198
Беспечный_Ангел
2004-12-23 23:03
2005.01.30
Суммирование столбцов в БД


14-1105388543
KilkennyCat
2005-01-10 23:22
2005.01.30
О дельфинах. возможно, баян :)


1-1106222018
Degobar
2005-01-20 14:53
2005.01.30
Можно ли скопировать облать из wmf файла в bitmap


3-1104085944
Vir
2004-12-26 21:32
2005.01.30
TADOQuery обновление