Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизПроблема с передачей параметров в хранимую процедуру Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c